#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 и получил много хороших обсуждений, но никаких ощутимых ответов без создания огромного объема работы. Хотя еще раз спасибо.