【发布时间】:2015-10-05 08:34:46
【问题描述】:
我知道这看起来像是重复的,因为在多个上下文中存在大量关于事务的问题,但没有一个涉及这种情况。
设置
- 开发机器上的 SQL Server 2016(最新预览版)或生产机器上的 SQL Azure v12
- 实体框架 6.1.3
- .Net 4.5 在常规应用程序上
- 应用程序可以在 Azure 云服务或 VM 上运行,这并不重要
我们在代码中拥有的东西
- 单个 TransactionScope
- 在 TransactionScope 之外创建了两个 DbContext(它是由与 ASP.Net MVC 相关联的依赖注入机制创建的,因此为了简化示例,我将其排除在外)
- 每个上下文创建并维护自己的连接,该连接指向不同服务器上的不同数据库(如果在开发机器上运行,它也可以指向同一服务器,但仍然是不同的数据库)。
- 我们使用常规 SQL 身份验证 - 用户 ID 和密码(以防有人指出一些帖子谈论集成安全和 MSDTC 的问题,我们不在本地使用它,因为在 Azure SQL 上不受支持)
我们的代码示例
当我们做这样的事情时:
var contextA = new ContextA();
var contextB = new ContextB();
using(var scope = new TransactionScope())
{
var objA = new EntityA();
objA.Name = "object a";
contextA.EntitiesA.Add(objA);
contextA.SaveChanges();
var objB = new EntityB();
objB.Name = "object B";
contextB.EntitiesB.Add(objB);
contextB.SaveChanges();
scope.Complete();
}
我们收到什么
System.Data.Entity.Core.EntityException 在调用 contextA.SaveChanges() 时被抛出,并带有以下消息:
根异常:底层提供程序在 EnlistTransaction 上失败。
内部异常:连接当前已登记事务。完成当前事务并重试。
那么,有人知道这个样本到底出了什么问题吗?
我们正在尝试使用多个上下文和每个上下文都有自己的数据库连接来创建单个事务。显然,由于每个上下文的数据都在不同的数据库服务器上(在生产中),我们不能使用接收 DbConnection 并与两个上下文共享它的 DbContext ctor,因此共享 DbConnection 不是一种选择。
非常感谢,非常感谢您的帮助。
【问题讨论】:
标签: sql-server entity-framework azure-sql-database transactionscope distributed-transactions