.net EntityConnection只能使用闭合的DbConnection构造
“EntityConnection只能使用闭合的DbConnection构造” 这就是我在尝试构造提供开放连接的entityconnection时遇到的问题。 有一个transactionscope打开,我不想打开新连接,否则该事务将被提升为dtc事务,因为我的理解是,如果我在多个entityConnections上使用单个SqlConnection,我不需要dtc 我的代码大概是这样的 先谢谢你.net EntityConnection只能使用闭合的DbConnection构造,.net,entity-framework,transactionscope,sqlconnection,objectcontext,.net,Entity Framework,Transactionscope,Sqlconnection,Objectcontext,“EntityConnection只能使用闭合的DbConnection构造” 这就是我在尝试构造提供开放连接的entityconnection时遇到的问题。 有一个transactionscope打开,我不想打开新连接,否则该事务将被提升为dtc事务,因为我的理解是,如果我在多个entityConnections上使用单个SqlConnection,我不需要dtc 我的代码大概是这样的 先谢谢你 using (TransactionScope transactionScope = ne
using (TransactionScope transactionScope = new TransactionScope())
{
using (SqlConnection dwConn = GetDWConnection(user))
{
dwConn.Open();
// I need to do some SQlConnection specific actions first
//EntityConnection specific actions next
Func1(dwConn);
Func2(dwConn); //similar to Func1()
Func3(dwConn); //Similar to Func1()
}
}
Func1(SqlConnection dwConn)
{
using (EntityConnection conn = GetSQLEntityConnection(sqlConnection))
{
ObjectContext objectContext = (ObjectContext)Activator.CreateInstance(objectContextType, new object[] { conn });
//few actions
}
}
private EntityConnection GetSQLEntityConnection(SqlConnection sqlConnection)
{
//few steps
EntityConnection entityConnection = new EntityConnection(entityConnectionStringBuilder.ToString());
EntityConnection sqlEntityConnection = new EntityConnection(entityConnection.GetMetadataWorkspace(),sqlConnection);
return sqlEntityConnection;
}
正如您已经发现的,您无法从打开的连接创建新的
EntityConnection
您应该重构代码并传递
ObjectContext
,而不是反复传递SqlConnection
并创建EntityConnection
ObjectContext
是EF中的根对象,您应该更喜欢它而不是SqlConnection
雅库布完全正确。您既不能创建DbContext
也不能创建EntityConnection
,将打开的DbConnection
传递给它们
据了解,在EF 6发布之前,该问题不会得到解决(您可以投票赞成)
解决方法是在任何涉及实体连接的操作之前打开已初始化的实体连接
给定ObjectContext
您可以像这样打开EntityConnection
:
((EntityConnection)objectContext.Connection).Open();
class MyDbContext : DbContext
{
public MyDbContext (DbConnection connection)
: base (connection, contextOwnsConnection: true)
{
((IObjectContextAdapter)this).ObjectContext.Connection.Open();
}
// …
}
class Program
{
public static void Main()
{
var connection = new SqlConnection(CONNECTION_STRING);
using (var database = new MyDbContext(connection))
{
Assert.IsTrue(connection.State == ConnectionState.Open);
}
Assert.IsTrue(connection.State == ConnectionState.Closed);
}
}
在DbContext
的情况下,可以从底层ObjectContext
获得EntityConnection
。代码可能如下所示:
((EntityConnection)objectContext.Connection).Open();
class MyDbContext : DbContext
{
public MyDbContext (DbConnection connection)
: base (connection, contextOwnsConnection: true)
{
((IObjectContextAdapter)this).ObjectContext.Connection.Open();
}
// …
}
class Program
{
public static void Main()
{
var connection = new SqlConnection(CONNECTION_STRING);
using (var database = new MyDbContext(connection))
{
Assert.IsTrue(connection.State == ConnectionState.Open);
}
Assert.IsTrue(connection.State == ConnectionState.Closed);
}
}
为什么不传递相同的
ObjectContext
实例?