实体框架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在事务(与单独的连接)中的操作的唯一方法?
我不记得我从哪里得到这个,但它帮助我在同一事务中运行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;
}
}