1

最初に EF5 コードを使用してSaveChanges()おり、同じトランザクションで複数の呼び出しをラップする必要があります。私はtransactionScopeの使用に比較的慣れていないため、目的を達成するためにオプションを微調整することはできません。

次のコードは、私の DbContext クラスのインスタンスが挿入されるサービス クラスにあります。このクラスのどこにも DbContext の追加インスタンスを作成しません。

まずは以下を試してみました。SaveChangesコードは素晴らしくきれいですが、関数内のメソッド中に DTC にエスカレートしようとしGenerateInvoiceます。

using (var scope = new TransactionScope())
{
    // This function does some work and calls SaveChanges
    Guid invoiceId = GenerateInvoice(cart);  

    // This function also does some querying and calls SaveChanges
    DeleteCart();

    // Transaction should only commit if both functions above were successful
    scope.Complete();

}

私はいくつかの調査を行い、コードを次のように変更しましたが、これは DTC にエスカレートしませんが、それが最善のアプローチであるかどうかはわかりません。

IObjectContextAdapter adapter = (IObjectContextAdapter)_context;

adapter.ObjectContext.Connection.Open();

using (var scope = new TransactionScope())
{

    // This function does some work and calls SaveChanges
    Guid invoiceId = GenerateInvoice(cart);  

    // This function also does some querying and calls SaveChanges
    DeleteCart();

    // Transaction should only commit if both functions above were successful
    scope.Complete();

    adapter.ObjectContext.Connection.Close();

}

SaveChangesDTC にエスカレートせずに、最初に複数の EF5 コードでトランザクション サポートを取得する簡単な方法はありますか?

ありがとう

4

1 に答える 1

2

私が見つけたわけではありません。そして、それは理にかなっています。SaveChanges()複数回呼び出すことで、データベースへの複数の接続を開く可能性があります。これらの接続間でトランザクションを調整する唯一の方法は、分散トランザクション (したがって MSDTC) を使用することです。

私が思いついた最善の解決策は、SaveChanges()一度だけ電話をかけることでした。これは、一部のコードを再構築することを意味する場合がありますが、トランザクション対応にする必要があるすべてのエンティティがすべて同時にコミットされるのが最善です。

1 回呼び出すだけSaveChanges()で、EF 変更トラッカーがそのキャッシュを使用して、アプリとデータベース間の多くの通信を節約することもできます。

于 2012-11-27T20:24:22.743 に答える