Я ищу предложения о том, как подойти с использованием ORM (в данном случае EF5) при разработке модульных немонолитных приложений с модулями Core и 3rd Party, где Core не имеет прямой ссылки на сторонние модули и модули имеют только ссылку на основные и общие таблицы и классы.
Для аргументов достаточно близкой аналогией будет DNN.
CodeFirst:
С CodeFirst подход, который я использовал, заключался в создании модели Db с помощью отражения: на этапе Core DbContext DbInitialation я использовал Reflection для поиска любого класса в любой dll (например, Core или различных модулей), украшенных IDbInitializer (пользовательский контракт, содержащий метод Execute()) для определения только структуры dll. Каждая dll добавила в DbModel то, что она знала о себе. Любое последующее сеяние также обрабатывалось одним и тем же ва (поиск конкретного контракта IDbSeeder и его выполнение).
Pro: * Подход работает пока. * Тот же основной DbContext может использоваться во всех репозиториях, если каждый репо использует dbContext.GetSet(), а не ожидает, что он будет свойством dbContext. Нет, biggie. Минусы: * он работает только при запуске (т.е. для добавления новых модулей потребуется обновление AppPool). * CodeFirst отлично подходит для POC. Но в EF5 он еще недостаточно зрел для работы Enterprise (и я не могу дождаться EF6 для StoredProcs и других функций, которые будут добавлены). * Мой администратор базы данных ненавидит CodeFirst, по крайней мере для Core, желая как можно больше оптимизировать эту часть с Stored Procs... Мы команда, поэтому я должен попытаться найти способ понравиться ему, если смогу найти способ...
База-первых:
Фаза DbModel, по-видимому, происходит до конструктора DbContext (чтение из встроенного файла ресурсов .edmx). DbInitialization никогда не вызывается (поскольку модель считается полной), поэтому я не могу добавить больше таблиц, чем то, о чем знает Core.
Если я не могу добавлять элементы в модель, динамически, как можно с CodeFirst, это означает, что * либо Core DbContext Model должна знать каждую таблицу в Db-Core и каждом стороннем модуле. Создание приложения Монолитное и высокосвязное, победив то, чего я пытаюсь достичь. * Или каждая сторонняя сторона должна создать свой собственный DbContext, импортируя таблицы Core, что приведет к * проблемы с версиями (модуль не обновляет *.edmx при обновлении Core *.edmx и т.д.) * дублирование везде, в разных контекстах памяти = трудно отследить проблемы concurrency.
На данный момент мне кажется, что подход CodeFirst - единственный способ, которым программное обеспечение Modular может быть достигнуто с помощью EF. Но, надеюсь, кто-то еще знает, как сделать DatabaseFirst shine - есть ли способ "добавления" DbSet к модели, созданной из встроенного файла .edmx?
Или любые другие идеи?