Entity Framework 6 Database First - 如何在 ADO 中共享连接和事务

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类的构造函数只接受关闭的连接。因此,我无法共享事务,因为连接必须在传递给上下文类之前关闭。
我正确吗?在这种情况下不可能共享一个连接吗?还是还有其他方法?
在EF 6 DB First和ADO中,TransactionScope仍然是包装操作的唯一方法(具有单独的连接)?

你能详细说明一下为什么想要共享连接吗? - Rob Tillie
@RobTillie 在我的应用程序中,部分代码仍使用 ADO,其他部分使用 EF。我想将 EF 和 ADO 中的操作包装在一个事务中。TransactionScope 有一些限制,MS 建议使用一种连接方法。较少的连接也是更好的。 - wlodziu
你可以使用反射来实现这个。我已经用 EF 和 SqlBulkCopy 实现过了。现在无法复制代码。 - Giorgi Nakeuri
我猜你是通过ado.net运行存储过程?你可以通过上下文运行存储过程。另外,我发现在同一应用程序中同时运行ado.net和ef时,最好为调试可能的数据库问题设置单独的连接字符串,这样你就可以看到哪些连接字符串存在问题。虽然我不知道答案,但这是关于该主题的一些建议。 - Bill Blankenship
1个回答

0

我不记得这是从哪里得到的,但它帮助我在同一事务中运行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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接