Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net EntityConnection只能使用闭合的DbConnection构造_.net_Entity Framework_Transactionscope_Sqlconnection_Objectcontext - Fatal编程技术网

.net EntityConnection只能使用闭合的DbConnection构造

.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

“EntityConnection只能使用闭合的DbConnection构造” 这就是我在尝试构造提供开放连接的entityconnection时遇到的问题。 有一个transactionscope打开,我不想打开新连接,否则该事务将被提升为dtc事务,因为我的理解是,如果我在多个entityConnections上使用单个SqlConnection,我不需要dtc

我的代码大概是这样的

先谢谢你

    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
实例?