質問: いろいろな理由から、 `DbContext` `SaveChanges`を呼び出すときに、いくつかのカスタムSQL `UPDATE`コマンドを実行できる必要があります。私はこれが原子的に発生して、通常の`SaveChanges`とSQLのどちらも成功するか、どちらも成功しないようにします。 私はこれを達成する方法を知らない。今まで私が試したことは、これとさまざまなバリエーションです: EF取引 - 要点 ここでのエラーは( `ExecuteSqlCommand`呼び出しで) > ExecuteNonQueryでは、コマンドに割り当てられた接続が保留中のローカルトランザクション内にある場合、コマンドにトランザクションが必要です。 > > さて、十分に公正。 `ExecuteSqlCommand`はトランザクションを受け入れるオーバーロードはありません。だから、私はDapperパッケージをインストールし、問題のある行をこのDapper呼び出しに置き換え、私はトランザクションを渡します: ``` this.Database.Connection .Execute("insert into Tests (Foo, Bar) values ('test', 2)", transaction: tran); ``` しかし今、 `base.SaveChanges()`エラーが発生し、次のようになります: > SqlConnectionは並列トランザクションをサポートしていません。 > > だから明らかに`SaveChanges`は、すでにdatacontextの接続で1つ作成していても、常に新しいトランザクションを作成します。 私が欲しいものを達成できる方法はありますか? 私はEntity Framework 5.0のコードを使用しています。
回答: すべての操作について`TransactionScope`ラップします。このクラスは.NETトランザクションの一般的な抽象です。 EFと`SqlConnection`が自動的に参加します。誤って分散トランザクションを引き起こすような落とし穴があるので、ベストプラクティスを探してください。