この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 23957|答える: 1

[出典] エンティティフレームワークにおける一括提出およびトランザクション処理

[リンクをコピー]
掲載地 2017/04/08 22:10:01 | | |

Entity FrameworkにおけるSaveChanges()の使用は非常に頻繁であり、データの単一の修正や削除後にSaveChanges()を呼び出すと、影響レコードの数が返されます。

データのバッチ修正やバッチ削除を使うには、SaveChanges(false)+AcceptAllChanges()メソッドが必要です。



SaveChanges(false)は、EFがデータベースに対して操作を行う必要があることを通知するもので、メモリ上で保留中であり、必要に応じて元に戻すことができます。例えば、AcceptAllChange()のコミットが本当に成功するとEFはSaveChanges(false)の操作を元に戻します。



分散トランザクション操作を扱う際にはTransactionScopeを使う必要があり、多くの場合このように書きます:


しかし、こうした書き方はリスクが高く、偽りです
例えば、コンテキスト1. SaveChanges() は成功しました、context2. SaveChanges() は問題があります。私たちはスコープ内にいます。 トランザクションがコミットされ、Context1が正常に実行された時点でComplete()は終了します

(私の実務では、文脈に応じて上記のことは通常ロールバック可能です。 SaveChanges() は成功しました、context2. SaveChanges() は問題があり、どちらも成功裏に実行されません!
プロジェクト内でSystem.Transactionの名前空間を参照してください。 TransactionScopeを定義することは、Scopeオブ・シングを定義することと同義であり、つまりこのトランザクションの範囲は使用の範囲内にあります。 使用範囲内で、範囲がなければ。 Complete()コマンドを実行すれば、破壊された際にスコープは自動的にすべての操作をロールバックします。 )

これが必ずしも私たちのニーズを満たすとは限りません。 もしcontext1とcontext2を同時に成功させる必要がある、またはどちらも成功しない場合は、以下のコードを使うなど、コードに小さな調整を加える必要があります。



まずはSaveChanges(false)を使って必要なデータベース操作コマンドをデータベースに送ります。これは、context1とcontext2は実際には変更されていないことを確認するためです。トランザクションが終了して自動的にロールバックされると、どちらの変更も実際にはデータベースにコミットされないため、ロールバックは正常にできます。




先の:EF6はトランザクション管理にDatabase.BeginTransactionを使用します
次に:EF ORM開発および使用シリーズチュートリアル
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com