Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有多个DbContext的事务,每个事务在实体框架上具有自己的连接_Sql Server_Entity Framework_Azure Sql Database_Transactionscope_Distributed Transactions - Fatal编程技术网

Sql server 具有多个DbContext的事务,每个事务在实体框架上具有自己的连接

Sql server 具有多个DbContext的事务,每个事务在实体框架上具有自己的连接,sql-server,entity-framework,azure-sql-database,transactionscope,distributed-transactions,Sql Server,Entity Framework,Azure Sql Database,Transactionscope,Distributed Transactions,我知道它看起来像是重复的,因为在多个上下文中有大量关于事务的问题,但没有一个涉及到这种场景 设置 开发机器上的SQL Server 2016(最新预览版)或生产机器上的SQL Azure v12 实体框架6.1.3 常规应用程序上的.Net 4.5 应用程序可以在Azure云服务或VM上运行,这并不重要 我们的代码是什么 单一事务范围 在TransactionScope外部创建了两个dbContext(它是由我们的依赖项注入机制创建的,与ASP.NETMVC相关联,因此为了简化示例,我省略了它)

我知道它看起来像是重复的,因为在多个上下文中有大量关于事务的问题,但没有一个涉及到这种场景

设置
  • 开发机器上的SQL Server 2016(最新预览版)或生产机器上的SQL Azure v12
  • 实体框架6.1.3
  • 常规应用程序上的.Net 4.5
  • 应用程序可以在Azure云服务或VM上运行,这并不重要
  • 我们的代码是什么
  • 单一事务范围
  • 在TransactionScope外部创建了两个dbContext(它是由我们的依赖项注入机制创建的,与ASP.NETMVC相关联,因此为了简化示例,我省略了它)
  • 每个上下文都创建并维护自己的连接,该连接指向不同服务器上的不同数据库(如果在开发机器上运行,也可以指向相同的服务器,但仍然是不同的数据库)
  • 我们使用常规的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();
    }
    
    我们收到的 调用
    contextA.SaveChanges()
    时抛出
    System.Data.Entity.Core.EntityException
    ,并显示以下消息:

    根异常:基础提供程序在登记事务时失败

    内部异常:连接当前已登记事务。完成当前事务并重试

    有人知道这个样本到底出了什么问题吗

    我们正在尝试使用多个上下文来创建一个事务,每个上下文都有自己的数据库连接。显然,由于每个上下文的数据位于不同的数据库服务器上(在生产环境中),我们不能使用接收DbConnection并与两个上下文共享它的DbContext ctor,因此共享DbConnection不是一个选项


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

    好的,SQL Azure不支持分布式事务

    Azure SQL数据库现在支持使用TransactionScope的分布式事务。看

    事实上你是对的。不幸的是,Azure上不支持分布式事务。谢谢