エンティティ A、B の関係は 1 対多です (A には多くの B があり、B は A に属している必要があります)。
lazy loading
次のようにA、Bを無効にしてロードします:
dbContext.As.Load();
//**particaly load B**
dbContext.Bs.Where(predicateX).Load();
私が使うとき
dbContext.As.Remove(someA)
A を削除するには、次のエラー メッセージが表示されます
The relationship could not be changed because one or more of the foreign-key properties is non-nullable
代わりに、次を使用すると:
//remove all B in someA
foreach(B b in someA.Bs.ToList())
{
dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA)
全て大丈夫。
これを行うより良い方法はありますか?
編集
私は Database First を使用しており、データベース側で B の外部キー制約 (カスケード削除時) を追加しています。
「外部キー制約」はコード「OnModelCreating」と同じだと思います。しかし、コード「dbContext.As.Remove(someA)」は期待どおりに機能しません。
ABC カスケードの 1 対多の関係がある場合、事態はさらに悪化します。someA を削除するには、次のようにする必要があります。
foreach(B b in someA.Bs.ToList())
{
foreach(C c in b.Cs.ToList())
{
dbContext.Cs.Remove(c);
}
dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA);
解決済み:
最初にデータベース(sqlite)を使用し、データベース側で外部キー制約を追加します。
vs2012 を使用して、sqlite データベース ファイルから edmx を作成し、
vs2012 は、リレーションシップの「on delete cascade」プロパティを設定できませんでした。
手動でプロパティを設定した後、「dbContext.As.Remove(someA)」への単一呼び出しは期待どおりに機能します!