3

是否可以在 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 中的操作包装在事务中的唯一方法(具有单独的连接)?

4

1 回答 1

0

我不记得我是从哪里得到这个的,但它帮助我在同一事务中EF运行。SqlBulkCopy以下是如何通过反射获取事务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;
    }
}
于 2015-06-10T06:42:19.037 回答