簡體   English   中英

實體框架多個復合鍵,在刪除時級聯

[英]Entity framework multiple composite keys, cascade on delete

我在使用代碼優先方法在3個表之間的Entity框架中配置復合鍵時遇到了一些問題。 我有一個具有Id的基類,我的所有類都繼承自該類。 第一個表具有第二個表項的集合,而它具有第三個表的集合。 從任一表中刪除元素時,在刪除時我都需要組合鍵來級聯。 我也在使用聚合根模式。

public abstract class BaseClass    
{
    [Key, Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
}

public class Table1 : BaseClass
{        
    public virtual ICollection<Table2> Table2Collection { get; set; }
    public string Name { get; set; }
}

public class Table2 : BaseClass
{   
    public Table1 Table1 {get; set;}

    [Key, ForeignKey("Table1"), Column(Order=1)]
    public long Table1ID { get; set; }

    public virtual ICollection<Table3> Table3Collection { get; set; }
    public string Name { get; set; }
}

public class Table3 : BaseClass
{   
    [Key, ForeignKey("Table2Id,Table1Id"), Column(Order = 1)]
    public Table2 Table2 { get; set; }

    public long Table2Id{ get; set; }

    public long Table1Id{ get; set; }
    public string Name { get; set; }
}

當我刪除表1或表2類型的元素時,上面的代碼工作正常,但是它不允許我從表3中刪除元素,但有以下異常:

“由於一個或多個外鍵屬性不可為空,因此無法更改該關系。對關系進行更改時,相關的外鍵屬性將設置為空值。如果外鍵不支持空值,必須定義新的關系,必須為外鍵屬性分配另一個非空值,或者必須刪除不相關的對象。”

貝婁是我的模型制作者:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Table2>()
      .HasRequired(x=>x.Table1)
      .WithMany(x =>x.Table2Collection)
      .WillCascadeOnDelete(true);

    modelBuilder.Entity<Table3>()
      .HasRequired(x=>x.Table2)
      .WithMany(x =>x.Table3Collection)
      .WillCascadeOnDelete(true);
}

我懷疑我可能沒有正確配置模型構建器,但似乎無法弄清楚如何配置它以允許刪除Table3類型的元素。 任何幫助,將不勝感激。

弄清楚我所缺少的。 我將這個答案提供給可能遇到與我相同的問題的任何人。 我需要將所有FK變成PK FK(因為它們不允許為空)。 這有點煩人,因為如果您有一棵甚至更復雜的樹,那么您必須管理的鍵的數量就會越深。

modelBuilder.Entity<Table3>().HasKey(m => new {m.Id, m.Table2Id, m.Table1Id});

如果有人對如何縮短管理密鑰的數量有任何想法,請留下答案。 由於這可能不是最佳解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM