6

エンティティ 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)」への単一呼び出しは期待どおりに機能します!

4

1 に答える 1