質問: ユーザーのデータベース内の多くのレコードに影響するプロセスを実行しています。私は、すべての変更の結果に応じて、すべての変更を適用するか、いずれも適用しないことのみを望みます。 (例えば、サブプロセスの1つが失敗した場合、全体的な変更は行われません)。また、プロセスの結果をユーザーに警告するために通知をデータベースに保存する場合もあります(たとえば、サブプロセスが失敗した場合、理由xによって変更が行われなかったことをユーザーに通知する通知が生成されます)。 私が考えることができる最善の方法は、変更トラッカー内のすべてのエントリをデタッチし、何かが成功または失敗して変更を保存した場合に通知を作成し、次にすべての変更を適用することです変更トラッカーを使用して`Entity State`をリセットし、変更をもう一度保存します。 私がこのアプローチに直面している問題は、 `Entity State`をリセットするとき、 `Entity State`が`Added`か`Modified`かどうかわかりません。エンティティの以前の状態を保存するために自分自身の変更トラッカーを実装することはできましたが、EFの変更トラッカーは冗長になります。 私はそれらを保存するときにエンティティの権利をすべて追加することもできますが、それは多くのオブジェクトをネストされたメソッドのチェーンリンクを最後まで渡す必要があります。 誰もがより良い提案をしているか、この問題のために言及されたハックの1つを使用する標準的な練習ですか?
回答: あなたはUnit of Workパターンを実装しようとしているようです。 `DbContext`ようEntityFrameworkのは、使用して、これはかなり簡単になり`DbContext`自己が仕事の単位*です* 。 新しいコンテキストをインスタンス化し、必要な変更を加えます。変更を行う関数にコンテキストを渡すことができます。 「論理ユニット」操作が完了したら、 `SaveChanges`呼び出します。個々のメソッドが`SaveChanges`呼び出さない限り、完了した論理操作全体が一度コミットされると、単一のユニットにそれらを一緒に`SaveChanges`ことができます。すべてが単一のトランザクション内で原子的にコミットされます。データは一貫性のない状態にはなりません。