Перекрестное объединение баз данных с помощью Linq — Обновление шаблона T4 для поддержки имени базы данных?

#linq #linq-to-sql #t4 #cross-database

#linq #linq-to-sql #t4 #перекрестная база данных

Вопрос:

В настоящее время я работаю в среде SQL Server с несколькими базами данных и использую linq to sql для выполнения запросов.

Я использую подход, описанный здесь, для достижения перекрестных соединений с БД: http://www.enderminh.com/blog/archive/2009/04/25/2654.aspx

итак, в основном:

2 контекста данных — Пользователи и платежи

 Users.dbo.UserDetails {PK: UserId }
Payments.dbo.CurrentPaymentMethod { PK: UserId }
  

Я перетаскиваю таблицы в DBML и в окне свойств меняю источник с dbo.Пользовательские данные в Users.dbo.UserDetails для полного уточнения имени базы данных.

Затем я могу выполнить перекрестное объединение в одном контексте данных, выполнив что-то вроде:

 var results = (from user in datacontext.Table<UserDetail>()
        join paymentmethod in dataContext.Table<CurrentPaymentMethod>() on user.UserId equals paymentmethod.UserId
    ... rest of query here ...);
  

Теперь это tickety boo и работает так, как я хочу. Единственная проблема, с которой я в настоящее время сталкиваюсь, — это когда происходят обновления схемы и т.д. (Что происходит относительно часто, поскольку мы находимся на значительном этапе разработки).

(и, наконец, вопрос!) Чего я хочу достичь (и я пометил вопрос как T4 в качестве предположения, поскольку я знаю, что файлы DBML управляются с помощью T4), так это автоматического способа, когда я перетаскиваю любую таблицу в контекст данных, чтобы источник автоматически выбирал имя базы данных (поэтому будет Users.dbo.UserDetails вместо просто dbo.Пользовательские данные)?

Спасибо за любые указания 🙂

Терри

Ответ №1:

Взгляните на T4 Toolbox и предоставляемый им генератор кода LinqToSql (любезно предоставленный Олегом Сычом) — Вы можете настроить шаблоны для генерации ссылок так, как вам хотелось бы, но я думаю, что проблема, с которой вы столкнетесь, заключается в том, что имя базы данных не сохраняется в файле dbml.

Что вы, вероятно, могли бы сделать, это добавить фильтр в генератор, возможно, используя словарь или аналогичный, чтобы в вашем файле .tt сохранялся список таблиц и баз данных, к которым они принадлежат. Таким образом, если вашей задачей обслуживания является удаление класса из конструктора и повторное его добавление, он получит правильное имя базы данных.

Комментарии:

1. Привет, Питер, спасибо за твой ответ, я поддержал его, поскольку это выглядело так, как будто он никогда не получит ответа. Я уже смотрел на T4 Toolbox, и хотя он очень мощный (и мы используем его для генерации перечислений из таблиц поиска в БД), на самом деле это не решает мою проблему в данном случае. На данный момент мне пришлось довольствоваться обходным путем, поскольку я также задавал этот вопрос в linkedin и получил много хороших обсуждений, но никаких ощутимых ответов без создания огромного объема работы. Хотя еще раз спасибо.