是否可以在 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 类构造函数只接受关闭的连接。 因此我无法共享事务,因为在传递给上下文类之前必须关闭连接。
我说得对吗,在这种情况下不可能共享一个连接,或者可能还有其他方法?
TransactionScope 仍然是将 EF 6 DB First 和 ADO 中的操作包装在事务中(具有单独的连接)的唯一方法吗?
最佳答案
我不记得我是从哪里得到这个的,但它帮助我在同一个事务中运行 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;
}
}
关于c# - Entity Framework 6 Database First - 如何与 ADO 共享连接和事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30732977/