Arthur Vickersは、次のブログ投稿で、DetectChanges
を呼び出す必要がない ( の前でなくてもSaveChanges
)場合のルールを定義しています。
EF コードを呼び出しても、コンテキストは、以前に呼び出す必要がなかった場合に DetectChanges を呼び出す必要がある状態のままになります。
AddとDeleteに関しては、 or を呼び出すAdd
か、 toまたはDelete
の状態を設定するため、これらは「EF コード」メソッドです。したがって、一連のエンティティをループして追加または削除するだけであれば、呼び出す必要はまったくありません。context.Entry(entity).State
Added
Deleted
DetectChanges
編集に関しては、もう少し微妙だと思います。いずれかを使用してエンティティを更新すると...
context.Entry(entity).CurrentValues.SetValues(someObject);
...またはプロパティ API を使用してDbContext
...
context.Entry(entity).Property(e => e.SomeProperty).CurrentValue = someValue;
...そして、これらは再び「EFコード」への呼び出しであるため、必要ありませんDetectChanges
(前でも必要ありません)。SaveChanges
次のようなエンティティのプロパティ値を変更するだけの場合...
entity.SomeProperty = someValue;
...次に、上記のリンク先の同じブログ投稿の 2 番目のルールが適用されます。
非 EF コードがエンティティまたは複合オブジェクトのプロパティ値を変更するたびに、DetectChanges を呼び出す必要がある場合があります。
そして、いくつかのエンティティをループし、それらをコンテキストにロードまたはアタッチし、いくつかの (スカラーおよび複雑な) プロパティ値を変更するだけの場合DetectChanges
、実際にはbeforeへの単一の呼び出しのみが必要だと思います。SaveChanges
より複雑なことを行う場合 (おそらく関係の変更? または他の何か?)、あなたのアプローチはもはや安全ではないかもしれません。
AutoDetectChanges
直前に一度だけ必要な場合は、そのままでは実装されず、多くの EF メソッドで呼び出されます。SaveChanges
同じブログ投稿で再び言及されています
Add または Attach を呼び出すだけでなく、コードがエンティティのプロパティを変更する場合は、ルール 2 により、少なくとも SaveChanges の一部として、場合によってはその前に DetectChanges を呼び出す必要があります。
(私からのハイライト)
DetectChanges
残念ながら、直前よりも早い段階で呼び出す必要がある場合に表示されるコードの例はわかりませんSaveChanges
。しかし、上記のポイント 1 のために、そのような例が存在すると確信しています。