Справочная информация:
Из другого вопроса здесь, в SO, у меня есть решение Winforms (финансы) со многими проектами (фиксированные проекты для решения).Теперь один из моих клиентов попросил меня «обновить» решение и добавить проекты / модули, которые будут получены из другого решения Winforms (HR).
Я действительно не хочу оставлять эти проекты фиксированными насуществующее финансовое решение.Для этого я пытаюсь создать плагины, которые будут загружать GUI, бизнес-логику и слой данных, используя 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 ...