Entity framework Azure上一个事务中的多个连接

Entity framework Azure上一个事务中的多个连接,entity-framework,azure,transactions,ado.net,connection,Entity Framework,Azure,Transactions,Ado.net,Connection,我们正在构建一个应用程序,即使用ADO.NET的遗留框架。该框架管理自己与DB的连接,以调用其代码API 对于任何定制和定制表,我们都使用实体框架,因此单独连接到数据库 应用程序和数据库将托管在Azure上 我们要做的是将对遗留框架和实体框架的调用包装到同一事务中 我们的理解是,这是一个分布式事务,但Azure中没有此功能 有没有办法让它在Azure环境中工作 e、 g 好的,您需要为您的事务使用相同的连接,因为SQL Azure不支持分布式事务。如果在同一事务中使用多个连接,即使所有连接都连接

我们正在构建一个应用程序,即使用ADO.NET的遗留框架。该框架管理自己与DB的连接,以调用其代码API

对于任何定制和定制表,我们都使用实体框架,因此单独连接到数据库

应用程序和数据库将托管在Azure上

我们要做的是将对遗留框架和实体框架的调用包装到同一事务中

我们的理解是,这是一个分布式事务,但Azure中没有此功能

有没有办法让它在Azure环境中工作

e、 g


好的,您需要为您的事务使用相同的连接,因为SQL Azure不支持分布式事务。如果在同一事务中使用多个连接,即使所有连接都连接到同一个数据库,ADO.NET也将升级到分布式事务。

正如肖恩·徐所说,您只需要使用一个连接。如果您能够将LegacyAPI更改为将打开的连接和事务作为输入,下面是如何使用EF6和edmx:

var workspace = new MetadataWorkspace(new[] { "res://*/" }, new[] { Assembly.GetExecutingAssembly() });
using (var connection = new SqlConnection("Normal ADO connection string with MultipleActiveResultSets=True"))
{
    using (var entityConnection = new EntityConnection(workspace, connection, false))
    {
        connection.Open();
        using (var transaction = connection.BeginTransaction())
        {
            using (var db = new EntityFrameworkDBEntities(entityConnection))
            {
                db.Database.UseTransaction(transaction);

                // Do stuff with db

                db.SaveChanges();
            }

            // Do ADO stuff on LegacyAPI using the connection and transaction objects

            transaction.Commit();
        }
    }
}
为了在dbcontext上获得额外的构造函数,需要创建这个分部类,其中false表示手动打开和关闭连接

partial class EntityFrameworkDBEntities
{
    public EntityFrameworkDBEntities(DbConnection connection) : base(connection, false) { }
}
作为奖励,您现在只需要在配置中使用一个连接字符串,并且它不包括通常附带的所有无用的EF垃圾(metadata=res://*/blabla)

如果您有一个包含多个模式的数据库,并且每个模式都有一个edmx,那么这也可以使用。请注意,尽管EntityConnections是相同的,但每个dbcontext都需要一个

partial class EntityFrameworkDBEntities
{
    public EntityFrameworkDBEntities(DbConnection connection) : base(connection, false) { }
}