3

「EntityConnection は、閉じた DbConnection でのみ構築できます」これは、開いた接続を提供する entityconnection を構築しようとしたときに発生する問題です。transactionscope が開いていて、新しい接続を開きたくない場合、または複数の entityConnections で単一の SqlConnection を使用する場合、DTC は必要ないことを理解しているため、トランザクションは 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

Jakubは完全に正しいです。どちらDbContextも作成できずEntityConnection、openedDbConnectionを渡しても作成できません。

Diego B Vega の投稿によると、この問題は EF 6 リリースまで修正されません (ここで投票できます)。

EntityConnection回避策は、それを含む操作の前に、既に初期化された状態で開くことです。

次のように開くことができるとしますObjectContextEntityConnection

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

の場合はDbContextEntityConnection基になる から入手できます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 に答える