質問: Entity Framework Core 2のChangeTrackerが、別のエンティティのリストからエンティティを削除して削除を行うと、削除されたエンティティの状態を「変更済み」に設定する理由を理解しようとしています。 この例を考えてみましょう。 ``` Class1 List MyListOfClass2Objects Class2 ``` どちらのクラスも、EFの`DbContext`独自の`DbSet`を持っています。私はからオブジェクトを削除した場合`MyListOfClass2Objects`リストと、その後呼び出し`DbContext.SaveChanges()`の状態`Class2`内のオブジェクト`ChangeTracker`に設定され`EntityState.Modified` 、およびない`EntityState.Deleted`私が期待され、。 `Set.Remove()`呼び出してエンティティを削除すると、 `ChangeTracker`の状態は`EntityState.Deleted`ます。ただし、どちらの場合も、エンティティはデータベースから削除されます。 Entity Frameworkは、エンティティを削除する方法によって、実際に両方のケースで削除されても、ChangeTrackerで異なる値を設定するのはなぜですか?
回答: **更新:**最後(のおかげで@Sebastian発見 )それは(執筆時点で)現在のEFコア実装の既知の問題であることが判明し、によってもともと追跡EFコアを修正#10093として子供のコレクションから削除するエンティティをマーク 。簡単な説明は次のとおりです。 > *SaveChangesが実行され*ている*間に*カスケード削除が行われるため、SaveChangesが実行される前の状態を見て、コード内にこの状態が表示されません。 > > そして > カスケード削除は、SaveChangesの一部として行われます。 > > 削除されたエンティティを参照しなくなった非削除エンティティの修正は、SaveChangesの後に発生します。 > > 現在関連付けられているアクション項目は、残念ながらバックログにフィックスアップとカスケードタイミングの設定を許可する#10114です。 **元の:** エンティティを対応する`DbSet`から削除すると、削除することをEFに指示しているためです。しかし、それを親エンティティコレクションから削除すると、関係が**optinal** (あなたのケースのように見える)の場合、EFはその子を親から切り離そうとします( `child.Parent`を`null`設定するのと同じです)。したがって、FKおよび親navgigationプロパティを`null`に設定し、エンティティを`Modified`としてマークし`null` 。本当に削除したい場合は、最初の方法を使用する必要があります。 すべてこれは、ドキュメントの関係を削除するセクションで説明されています: > リレーションシップを削除するには、参照ナビゲーションをnullに設定するか、関連するエンティティをコレクションナビゲーションから削除します。 > > リレーションシップを削除すると、リレーションシップで設定されたカスケード削除動作に従って、依存エンティティに副作用が生じる可能性があります。 > > デフォルトでは、必要な関係の場合、カスケード削除動作が設定され、子/依存エンティティがデータベースから削除されます。オプションの関係の場合、カスケード削除はデフォルトでは設定されていませんが、外部キーのプロパティはnullに設定されます。 > >