背景:
从 SO 的另一个问题来看,我有一个 Winforms 解决方案(财务),其中包含许多项目(解决方案的固定项目)。现在,我的一位客户要求我“升级”解决方案并添加来自另一个 Winforms 解决方案 (HR) 的项目/模块。
我真的不想将这些项目作为现有财务解决方案的固定项目。为此,我正在尝试创建所有使用 MEF 加载 GUI、业务逻辑和数据层的插件。
问题:
我有一个带有外部上下文列表的上下文(为实现通用存储库模式而构建的 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。永远不要吼叫。
如果可以以无法扩展到 MSDTC 的方式使用 TransactionScope,那很好,但我从未实现过。我一直使用 TransactionScope 它进入 MSDTC。根据 SO 上的另一篇文章,在某些情况下 TS 不会进入 MSDTC:请查看此处。但我真的更喜欢采用其他方式而不是 TransactionScope ...