3

“EntityConnection 只能用封闭的 DbConnection 构造”这是我在尝试构造提供开放连接的 entityconnection 时遇到的问题。有一个事务范围打开,我不想打开新连接,否则事务将被提升为 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;
        }
4

2 回答 2

2

雅库布是完全正确的。您既不能创建也DbContext不能EntityConnection打开DbConnection传递给它们。

根据Diego B Vega 的帖子,这个问题在 EF 6 发布之前不会得到修复(在这里你可以投票)

EntityConnection解决方法是在涉及它的任何操作之前打开已经初始化的。

鉴于ObjectContext您可以EntityConnection这样打开:

((EntityConnection)objectContext.Connection).Open();

在这种情况下,DbContext可以EntityConnection从底层获得ObjectContext。代码可能是这样的:

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);
    }
}
于 2012-11-14T18:02:15.650 回答
0

正如您已经发现的那样,您无法EntityConnection从打开的连接中创建新连接。

而不是一遍又一遍地传递SqlConnection和创建,你应该重构你的代码并传递。是 EF 中的根对象,您应该更喜欢它。EntityConnectionObjectContextObjectContextSqlConnection

于 2011-08-25T18:31:55.960 回答