实体框架6数据库优先-如何与ADO共享连接和事务

本文关键字:ADO 共享 连接 事务 框架 数据库 实体 | 更新日期: 2023-09-27 17:54:45

是否有可能在EF6 DB First方法和一些ADO操作之间共享一个连接(和事务)?

我在这里读到:https://msdn.microsoft.com/en-us/data/dn456843.aspx#existing自EF v6以来,可以共享连接和事务,但我必须将SqlConnection对象作为参数传递给上下文类的构造函数。但如果我在DB First方法中这样做,我会得到UnintentionalCodeFirstException。

我在这里读到:https://msdn.microsoft.com/en-us/data/jj592674当使用DB First方法时,我必须使用EntityConnection实例作为上下文类构造函数的参数。但是EntityConnection类构造函数只接受CLOSED连接。因此,我不能共享事务,因为连接必须在传递给上下文类之前关闭。

我是对的,在这种情况下不可能共享一个连接,或者可能有其他方式?

是否TransactionScope仍然是封装EF 6 DB First和ADO在事务(与单独的连接)中的操作的唯一方法?

实体框架6数据库优先-如何与ADO共享连接和事务

我不记得我从哪里得到这个,但它帮助我在同一事务中运行EFSqlBulkCopy。以下是如何从Entity Framework中获取反射事务:

EntityConnection ec = (EntityConnection)Context.Connection;
SqlConnection sc = (SqlConnection)ec.StoreConnection;
SqlTransaction sqlTransaction = null;
var parserProp = sc.GetType().GetProperty("Parser", BindingFlags.NonPublic | BindingFlags.Instance);
if (parserProp != null)
{
    var parser = parserProp.GetValue(sc, null);
    var sqltxProp = parser.GetType().GetProperty("CurrentTransaction", BindingFlags.NonPublic | BindingFlags.Instance);
    var currentTransaction = sqltxProp.GetValue(parser, null);
    sqlTransaction = currentTransaction as SqlTransaction;
    if (sqlTransaction == null)
    {
        var parentProp = currentTransaction.GetType().GetProperty("Parent", BindingFlags.NonPublic | BindingFlags.Instance);
        currentTransaction = parentProp.GetValue(currentTransaction, null);
        sqlTransaction = currentTransaction as SqlTransaction;
    }
}