3

Entity FrameworkのObjectContext.Connection.BeginTransaction()メソッドが返すトランザクションで、MSDTC(Microsoft Distributed Transaction Coordinator)のサポートが使用されているかどうかを確認しますか?ObjectContext.Connection.BeginTransaction()はMSDTCを使用していますか?

MSDTCのサポートなしにトランザクションを使用する方法はありますか?

+1

ObjectContext.Connectionは通常のADO.NET接続であるので、それは、Entity Frameworkのに関連していません... –

答えて

5

特定の条件下でMSDTCによって調整されたトランザクションに自動的に昇格します。 ObjectContext.SaveChanges()に電話をするたびに、スコープ内にまだトランザクションがない場合に新しいトランザクションが作成されます(有効なトランザクションがすでに有効な場合は、そのトランザクションに参加します)。ただし、デフォルトでは、ObjectContext.SaveChanges()に電話するたびに接続が開かれ、閉じられます。したがって、メソッドの冒頭でObjectContext.Connection.BeginTransaction()を呼び出すと、SQL ServerとEntity Frameworkの一部のバージョンで元のトランザクションを保持しながらObjectContext.SaveChanges()を複数回呼び出すと、トランザクションがMSDTCに昇格される可能性があります。単一のトランザクション内の異なる接続。あなたがMSDTCに昇格なっトランザクションを避けるためにしようとしている場合は、明示的に最初にあなたの接続をオープンし、完了したら、それを閉じます。

using(MyEntities context = new MyEntities()) 
using(DbConnection conn = context.Connection) 
{ 
    conn.Open(); 
    DbTransaction transaction = conn.BeginTransaction(); 

    // now do stuff within the transaction scope 

    transaction.Commit(); 
} 

しかし、だとしてあなたは、のTransactionScopeを使用することをお勧めしますプラットフォームに依存しない柔軟性があり、将来的にMSDTCが必要なものが実際に必要であると判断した場合は、より簡単になります。 EntityFrameworkがアクティブのTransactionScopeあります場合は、自動的にトランザクションに登録します:

using(TransactionScope transaction = new TransactionScope()) 
using(MyEntities context = new MyEntities()) 
using(DbConnection conn = context.Connection) 
{ 
    conn.Open(); 

    // now do stuff within the transaction scope 

    transaction.Complete(); 
} 
関連する問題