Предыстория:
Из другого вопроса здесь, в SO, у меня есть решение Winforms (Finance) со многими проектами (фиксированные проекты для решения). Теперь один из моих клиентов попросил меня «обновить» решение и добавить проекты/модули, которые будут взяты из другого решения Winforms (HR).
Я действительно не хочу сохранять эти проекты как фиксированные проекты в существующем финансовом решении. Для этого я пытаюсь создать плагины, которые будут загружать графический интерфейс, бизнес-логику и уровень данных, используя MEF.
Вопрос.
У меня есть контекст (DbContext, созданный для реализации универсального шаблона репозитория) со списком внешних контекстов (загружаемых с помощью MEF — эти контексты представляют контексты из каждого подключаемого модуля, а также с помощью универсального шаблона репозитория). Шаблон репозитория).
Допустим, у меня есть это:
public class MainContext : DbContext
{
public List<IPluginContext> ExternalContexts { get; set; }
// other stuff here
}
а также
public class PluginContext_A : DbContext, IPluginContext
{ /* Items from this context */ }
public class PluginContext_B : DbContext, IPluginContext
{ /* Items from this context */ }
и в уже загруженном классе MainContext у меня есть оба внешних контекста (из плагинов).
Имея это в виду, допустим, у меня есть транзакция, которая повлияет как на MainContext, так и на PluginContext_B.
Как выполнить обновление/вставку/удаление в обоих контекстах в рамках одной транзакции (единство работы)?
Используя IUnityOfWork, я могу установить SaveChanges() для последнего элемента, но, насколько я знаю, у меня должен быть один контекст, чтобы он работал как одна транзакция.
Есть способ использовать MSDTC (TransactionScope), но этот подход ужасен, и я бы вообще не стал его использовать (также потому, что мне нужно включить MSDTC на клиентах и сервере, и у меня все время были сбои и утечки).
Обновление:
Системы используют SQL 2008 R2. Никогда не ревите.
Если есть возможность использовать TransactionScope таким образом, чтобы он не масштабировался до MSDTC, это прекрасно, но я так и не добился этого. Все время, когда я использовал TransactionScope, он входит в MSDTC. Согласно другому сообщению на SO, в некоторых случаях TS не переходит в MSDTC: машины">проверьте здесь. Но я бы предпочел пойти другим путем вместо TransactionScope...