質問: null) return; foreach (var item in items.Select(entityEntry => entityEntry.Entity).Where(i => i != null)) { // ... create audit log using AuditDetails values ... // } // ... and call base.SaveChanges() ... // } } } ``` したがって、質問は次のようになります。 * これを`SavingChanges`イベントハンドラに移動するとメリットはありますか?または、おそらく両方を使用するように機能を分割しますか? * `AuditDetails`情報は`AuditDetails`使用を排除し`SavingChanges`か? * トランザクションで使用するBoolean引数を受け入れる`SaveChanges`オーバーライドはありません。どのようにそれを変更するソリューションを追加するだろうか? 要約すれば: * いつあなたは`SaveChanges`をオーバーライド/実装しますか? `SavingChanges`イベントハンドラを使用するのは`SavingChanges`ですか?
回答: ほとんどの場合、それは本当に問題ではないと思います。両方のオプションのうちの1つを要求していると思う3つの状況があります。 1. `SaveChanges`は完全にオーバーライドする必要がある`SaveChanges` 、 `base.SaveChanges`は`base.SaveChanges`ません。オーバーライドのみがこれを行うことができます。 2. 変更を保存するときに起こることには別のクラスが関与しています。イベントだけが変更を保存できます。 (あるいは、私が言うべきことは、イベントは選ぶべき明白なパターンだろう)。 3. オプションで`SaveChanges`を拡張したいとします。私の好みでは、 `option`がメンバ変数として格納されていなければならない`if (option)`でオーバーライドを開始するよりも、いくつかのパラメータでコンストラクタのイベントをアクティブにする方がきれいです。 他のすべての場合、私は常にオーバーライドを使用します。イベントが必要と`ObjectContext` (それはだから最初に掘り起こさなければ`ObjectContext.SavingChanges` )。オーバーライドはハードワイヤードです。イベントのサブスクリプションは、コードのメンテナンスで何らかの形で破損する可能