LINQ to SQL: несколько/один .dbml для каждого проекта?
Я прочитал статью Рика Стралла о Linq to SQL DataContext Lifetime Management, надеясь найти ответы на вопрос о том, как я буду управлять своим .dbml так как они так тесно связаны с DataContext. К сожалению, статья Рика, похоже, сосредоточена на жизни DataContext во время выполнения, и мой вопрос связан с тем, как .dbml должен быть организован во время разработки.
Здесь задан общий вопрос "Лучшие практики с .dbml's ', и ответы были сосредоточены на внешних инструментах для управления .dbml.
Я задаю более целенаправленный вопрос о , когда и почему у вас не должно быть одного .dbml файла в вашем проекте на основе LINQ to SQL?
Ответы
Ответ 1
Обратите внимание, что LINQ2SQL предназначен для простого и простого способа обработки отношений с объектами.
Не нарушайте связь таблицы и единицы концепции работы, создавая несколько файлов .dbml.
Если вам когда-либо понадобится создать несколько файлов .dbml(которые я не рекомендую), попробуйте выполнить следующее: -
- Если вы создаете несколько баз данных без взаимосвязи между этими таблицами базы данных.
- Если вы хотите использовать один из этих .dbml только для обработки хранимых процедур
- Если вам не нужна концепция единицы работы.
Если ваша база данных слишком сложна, я бы рассмотрел ORM, такой как NHibernate, EF 4
Ответ 2
По-моему, вы можете разбить файлы .dmbl, чтобы каждый из них содержал подмножество таблиц /procs из БД в зависимости от функции и отношения. Я еще не сделал этого, так что это просто мнение.
Однако я создал несколько файлов .dbml, чтобы помочь в модульном тестировании. Если вы работаете в среде, которая ограничивает использование хранимых процедур в рабочей среде, вы не можете использовать таблицу .dbml(вы можете использовать часть proc). Поэтому, если вы "unit test" (это действительно интеграционное тестирование), уровень БД вашего кода вы можете вызвать обертку proc, а затем проверить результаты, запросив таблицы через интерфейс .dbml. В таких случаях я разбиваю файл .dmbl только на таблицы, которые я хочу запросить в своем "unit test".
Дополнительная информация: У меня есть 2 решения, которые я создаю. Один из них имеет модульные тесты и никогда не строится на сервере сборки. Другая построена на сервере сборки и развернута для тестирования/производства.
Ответ 3
Я бы сказал, вам всегда нужна только одна база данных PER dbml файла. Если у вас несколько подключений к другим базам данных, подумайте о разработке или использовании отдельных dbml файлов. В любом случае, для каждой базы данных достаточно.
Это связано с тем, что dbml mapps к вашим таблицам и почему не просто использовать один "соединитель данных" / "слой данных" для этого, кажется странным/странным дизайном для использования более чем одного.
Это, вероятно, более управляемо, используя только 1.
Ответ 4
Этот вопрос был тщательно проанализирован здесь: http://craftycode.wordpress.com/2010/07/19/linq-to-sql-single-data-context-or-multiple/
Таким образом, вы должны создать не более одного контекста данных для сильно связанной группы таблиц или одного контекста данных для каждой базы данных.
Ответ 5
Скажем, у вас есть база данных:
База данных D содержит таблицы A, B, C, X, Y, Z, где
- Таблица A имеет внешний ключ
связь с таблицами B и C
- Таблица X имеет внешний ключ
связь с таблицами Y и Z
- Таблица X также имеет отношение внешнего ключа к таблице A
Скажем, у вас есть 2 файла DBML P и Q на основе базы данных D
- DBML файл P содержит объекты A ', B'
и C ', где A' связано с B '
и C 'через ассоциации.
- Файл DBML Q
содержит сущности X ', Y' и Z ', где
X 'соединен с Y' и Z 'через
ассоциации.
AFAIK, нет возможности для файлов DBML P и Q содержать связь между объектами A 'и X'. Это самая большая проблема с наличием нескольких файлов DBML.
На мой взгляд, файл DBML отражает модель данных, представленную таблицами, и ограничения на эти таблицы в базе данных. Если в наборе DBML файлов отсутствуют некоторые таблицы или ограничения, тогда набор файлов DBML не точно отражает базовую базу данных.
Возвращаясь к нашему примеру, если между таблицами A и X в базе данных D не было никакой связи, тогда можно было бы создать 2 файла DBML.
В общем случае можно иметь несколько файлов DBML, если каждый DBML файл содержит все сущности и отношения, которые связаны. Обратите внимание, что обратное не является проблемой, т.е. Может быть один DBML файл, содержащий несколько групп сущностей, которые не связаны друг с другом никакими ассоциациями.
Ответ 6
Ответ сложный, потому что это то, что требует ситуация. Я пытаюсь логически отделить каждый DBML в контекстах (в конце концов, DBML предоставляет функциональность DataContext). Поэтому, если мое приложение имеет один контекст, то для меня нет смысла иметь отдельный DBML для каждой таблицы. Контекст - это король при создании ваших файлов DBML, что я говорю.
Ответ 7
Еще одна вещь, которую следует иметь в виду, заключается в том, что LINQ использует DataContext для отслеживания идентификаторов экземпляров создаваемых ими объектов. Следовательно, объект, представляющий строку в таблице, созданной одним экземпляром класса DataContext, не совпадает с созданным другим, даже если все свойства одинаковы.
Если у вас есть несколько файлов DBML, то по необходимости будет несколько экземпляров DataContexts, по одному для каждого файла DBML. Следовательно, сущности не могут соединяться или разделяться из одного DataContext в другой.
Это применимо, если сущность существует в обоих (или всех) DBML файлах.
Ответ 8
Да, хм, я прочитал подробный анализ в craftycodeblog, но не было бы неплохо, если бы вы могли получить все преимущества с обеих сторон?
Я хочу иметь один DataContext для моего приложения, но все же разбить его на несколько файлов .dbml(и несколько файлов dbml.layout и designer.cs). Я предполагаю, что это не поддерживается Visual Studio, но это решит все проблемы.
Пример использования: большое приложение состоит из нескольких модулей, каждый из которых добавляет набор приложений (и, конечно, код) к приложению (то есть к одной базе данных) и имеет доступ к коду и таблицы других модулей.
Пусть скажем, модуль ABC определяет таблицы A, B, C, а модуль XYZ определяет таблицы X, Y, Z.
Таблицы XYZ могут иметь внешние ключи к таблицам ABC. Было бы лучше, если бы:
* При работе с кодом модуля ABC вы видите "только" таблицы ABC, как в дизайнере, так и в редакторе linq.
* При работе с кодом модуля XYZ вы можете видеть только таблицы XYZ в дизайнере dbml, чтобы вы уменьшили беспорядок и увидели только схему вашего модуля. Редактор linq должен иметь доступ к таблицам ABC и XYZ.