Entity framework 实体框架-跨有限上下文共享事务

Entity framework 实体框架-跨有限上下文共享事务,entity-framework,transactions,dbcontext,bounded-contexts,Entity Framework,Transactions,Dbcontext,Bounded Contexts,我正在开发一个非常大的应用程序,它有100多个模块,数据库中有近500个表。我们首先使用EntityFramework4.2代码将此应用程序转换为WPF/WCF。我们的数据库是SQLAnywhere 11。由于数据库的大小,我们使用的方法类似于Julie Lerman在这里描述的有界DBContext。 我们的每个模块都创建自己的DbContext,只对它需要的数据库子集进行建模 然而,我们在创建DBContext的方式上遇到了一个严重的问题。我们的模块不是完全独立的,也不可能完全独立。有些包含

我正在开发一个非常大的应用程序,它有100多个模块,数据库中有近500个表。我们首先使用EntityFramework4.2代码将此应用程序转换为WPF/WCF。我们的数据库是SQLAnywhere 11。由于数据库的大小,我们使用的方法类似于Julie Lerman在这里描述的有界DBContext。 我们的每个模块都创建自己的DbContext,只对它需要的数据库子集进行建模

然而,我们在创建DBContext的方式上遇到了一个严重的问题。我们的模块不是完全独立的,也不可能完全独立。有些包含从其他几个模块调用的操作。当它们被调用时,它们需要参与由调用模块启动的事务。(出于体系结构的原因,DTC不是我们的选项。)在旧的ADO体系结构中,为了支持事务,在模块之间传递开放连接没有问题

我研究了各种DbContext构造函数重载,并尝试从EntityConnection和StoreConnection管理事务,据我所知,没有允许ModuleA开始事务、调用ModuleB中的函数以及让ModuleB的DbContext参与事务的组合

可以归结为两件简单的事情:

案例1。如果我使用DbContextA的EntityConnection构建DbContextB,则DbContextB不会使用自己的模型元数据构建;它重用DbContextA的元数据。由于上下文具有不同的数据库集集合,因此ModuleB的所有查询都会失败。(实体类型不是当前上下文的一部分。)

案例2。如果我使用ModuleA的StoreConnection构造DbContextB,DbContextB在EntityConnection级别无法识别StoreConnection的打开事务,因此当ModuleB调用SaveChanges()时,EF会尝试启动新事务。由于数据库连接实际上有一个打开的事务,因此会生成一个数据库异常。(连接不支持并行事务。)

有没有办法1)在案例1中强制DbContextB构建自己的模型,或者2)在案例2中获取DbContextB的ObjectContext以尊重其StoreConnection的事务状态


(顺便说一句,我在EF6 alpha中看到了一些令人鼓舞的东西,但在测试之后,发现唯一的区别是我可以在开放连接上创建DbContextB。但即使如此,上述两个问题仍然存在。)

我建议您尝试使用
TransactionScope
对象为您管理此任务。只要所有
dbcontext
使用相同的连接字符串(非连接对象),事务就不应尝试登记MS-DTC