SaveChanges()内のカスタム原子UPDATEコマンド

c# dapper entity-framework savechanges transactions

質問

いろいろな理由から、 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が自動的に参加します。誤って分散トランザクションを引き起こすような落とし穴があるので、ベストプラクティスを探してください。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow