Фон:
У нас есть проект со многими модулями. Мы используем EntityFramework 4.2 с FluentAPI (CodeFirst).
Существует центральный проект с именем Diverto.ORM.EntityFramework.SQLServer, который содержит частичные классы, которые создают контекст с использованием FluentAPI (и который имеет ссылки на каждый другой проект в решении).
Недавно мы получили запрос от заказчика на реализацию многих других функций, и для решения потребуется несколько других проектов. Некоторые из этих проектов будут поступать из другой системы (Human Resources), и некоторые из них будут созданы. Ядром существующего решения является финансовая система.
Мы хотим включить и отключить эти новые проекты (и графический интерфейс, бизнес-логику и все) "на лету" с использованием MEF. Они будут взаимодействовать как плагины, а главное меню из приложения будет заполнено также с помощью MEF.
Однако мы действительно не имеем понятия о том, как включать/отключать эти модули/проекты (новые и HR) из-за данных, которые они должны использовать.
Рассмотрим это:
- DivertoContext (основной контекст) с DbSet <ClassA> и DbSet <ClassB> .
- PluginContext (из плагина) с DbSet <ClassC> .
Теперь рассмотрим, что внутри GUI я должен иметь доступ к данным ClassA, ClassB и ClassC (если плагин есть).
Решение найдено! См. Ниже
ЭТО, ВЫ ТЕПЕРЬ, ПРОЧИТАЙТЕ ЭТО ПЕРЕД ОТВЕТОМ!
Я заметил, что некоторые люди проверяют это и отмечают это как фаворит или первенство. Пожалуйста, имейте в виду, что этот ответ восходит к 2012 году, и EntityFramework сменил много.
Кроме того, пожалуйста, ПОЖАЛУЙСТА, помните, что у каждого проекта есть свои собственные потребности. В то время мне нужна эта функция. Возможно, вам не нужен этот проект, или просто некоторые части этого!
Наконец, чтобы убедиться, что все закрыто, да, можно сделать эту работу с EF 6.1 и EF Migrations, и это возможно с другими структурами ORM и миграции.
Вам могут потребоваться некоторые другие интерфейсы, как один для миграции для загрузки, и надлежащим образом обрабатывать определенную миграцию плагина (не смешивайте его с другими плагинами, поэтому старайтесь реализовать какой-то уникальный токен для каждого плагина).