私は次のモデルを持っています:
public class List
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<ListRules> ListRule { get; set; }
}
public class ListRule
{
public virtual int Id { get; set; }
public virtual List List { get; set; }
public virtual ICollection<List> Lists { get; set; }
}
List は多くの ListRules を持つことができます。ListRule は 1 つのリストに属している必要があります。ListRule には、0 個、1 個、または多数のリストを関連付けることもできます。
次のバインディングを試しました。
modelBuilder.Entity<ListRule>()
.HasRequired(x => x.List)
.WithMany(x => x.ListRule)
.Map(x => x.MapKey("ListId"));
modelBuilder.Entity<ListRule>()
.HasMany(x => x.Lists)
.WithMany()
.Map(x => {
x.MapLeftKey("ListRuleId");
x.MapRightKey("ListId");
x.ToTable("ListRuleLists");
});
先に進む前に、探している結果を明確にしたいと思います。
誰かがリストを削除したときに、カスケード削除制約を使用して、ListRule テーブル内のリストに関連付けられた関係と、ListRule テーブルと ListRuleLists テーブルの間の多対多の関係を自動的に削除する必要があります。
Update-Database を実行しようとすると、「テーブル 'ListRuleLists' の FOREIGN KEY 制約 'FK_ListRuleLists_Lists_ListId' により、サイクルまたは複数のカスケード パスが発生する可能性があります」というエラーが表示されます。これがなぜなのかを理解しています。現在、それを解決する 1 つの方法は、上記の最初のモデル バインディングに WillCascadeOnDelete(false) を追加することです。
しかし、これは望ましくない副作用を引き起こします。ListRuleList テーブルに多対多の関係がない 1 つの ListRule を持つ 1 つのリストがあるとします。ユーザーがリストを削除すると、WillCascadeOnDelete(false) のために ListRule が孤立するようになりました。
代わりに、WillCascadeOnDelete(false) を 2 番目のバインドの RightKey 側に追加するにはどうすればよいですか? つまり、外部キー制約「FK_ListRuleLists_Lists_ListId」からカスケード削除を削除したいのです。
出来ますか?そうでない場合、この問題を解決する他の方法はありますか?