7

私は次のモデルを持っています:

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」からカスケード削除を削除したいのです。

出来ますか?そうでない場合、この問題を解決する他の方法はありますか?

4

0 に答える 0