質問: model.Childs; } context.SaveChanges(); } ``` 子供の内部の変化を検出する代わりに、EFは古い子供と何をするべきかを教えてくれません。たとえば、 `parentFromDB`に3つの子がある場合は、DBから最初にそれを取り出し、2番目と3番目の子を削除します。次に、保存しているときに`The relationship could not be changed because one or more of the foreign-key properties is non-nullable` 。 私はこれが起こったと信じています : 1つ以上の外部キーのプロパティがnullにできないために、関係を変更できませんでした 私のシナリオでは、DBからフェッチしてエントリを更新して`SaveChanges`を呼び出すことができないため、どちらが正方形に戻ったのですか。
回答: > EFはナビゲーションプロパティ内の変更を検出できないため > > これは、 `_dbContext.Entry(obj).State = EntityState.Modified`がナビゲートプロパティーを変更済みとしてマークしていないという事実を幾分歪めているようです。 もちろん、EFはナビゲーションプロパティの変更を追跡します。これは、コンテキストの変更と、コンテキストに関連付けられたすべてのエンティティの関連付けを追跡します。したがって、あなたの質問への答えは、今確実に述べられている... > EFで子コレクションをすぐに更新することは可能ですか > > ...あります: **はい** 。 唯一のことは、 **あなたは*箱から出さ*ないことです** 。 コレクションの中で親であるか子であるかに関わらず、エンティティを更新するための「すぐに使える」方法は次のとおりです。 * エンティティをデータベースから取得します。 * プロパティを変更するか、要素をコレクションに追加/削除する * `SaveChanges()`呼び出します。 それで全部です。 Efは変更を追跡し、エンティティの`State`明示的に設定しません。 しかし、切断(n-tier)シナリオでは、これはより複雑になります。エンティティをシリアライズしてデシリアライズするので、変更を追跡するコンテキストはありません。エンティティをデータベースに格納したい場合は、EFに変更を知らせるようにしてください。これを行うには基本的に2つの方法があります: * エンティティについて知っていることに基づいて、状態を手動で設定します(プライマリキーが0より大きい場合は、存在し、更新する必要があります) * *状態をペイントし*ます。データベースからエンティティを取得し、その変更をデシリアライズされたエンティティからエンティティに再適用します。 団体関係については、常に*国家*に*ペイントする*必要が*あります* 。現在のエンティティをデータベースから取得し、どの子が追加/削除されたかを判断する必要があります。逆シリアル化されたオブジェクトグラフ自体からこれを推論する方法はありません。 国家を描くこの退屈で精巧な作業を軽減するさまざまな方法がありますが、それはこのQ&Aの範囲を超えています。いくつかの参考文献: * 集約全体を更新する汎用リポジトリ * GraphDiff