使用多个DbContext进行事务处理,并且每个DbContext都在Entity Framework上具有自己的连接

时间:2015-07-16 03:45:55

标签: sql-server entity-framework azure-sql-database transactionscope distributed-transactions

我知道它看起来像是重复的,因为关于多个上下文的交易存在大量问题,但没有一个涉及这种情况。

设置

  1. 开发计算机上的SQL Server 2016(最新预览版)或生产中的SQL Azure v12
  2. 实体框架6.1.3
  3. .Net 4.5在常规应用程序上
  4. 应用程序可以在Azure云服务或VM上运行,并不重要
  5. 我们在代码中有什么

    1. 单个TransactionScope
    2. 两个DbContexts在TransactionScope中创建外部(它是由我们的依赖注入机制创建的,它们与ASP.Net MVC相关联,因此我将其排除在范围内以简化示例)
    3. 每个上下文创建并维护自己的连接,该连接指向不同服务器上的不同数据库(如果在开发计算机上运行,​​它也可以指向同一服务器,但仍然是不同的数据库)。
    4. 我们使用常规SQL身份验证 - userId和密码(以防有人指向某些帖子谈论集成安全和MSDTC的问题,我们不在本地使用它,因为在Azure SQL上它不受支持)< / LI>

      我们的代码示例

      当我们做类似的事情时:

      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不是一种选择。

      非常感谢,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

AFAIK,SQL Azure不支持分布式事务。 Source

答案 1 :(得分:1)

Azure SQL数据库现在支持使用TransactionScope的分布式事务。见TransactionScope() in Sql Azure