2014-10-31 113 views
0

我有一個在實體框架配置組合鍵在3個表之間的代碼第一種方法有點問題。我有一個基類,它有我的所有類繼承的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。任何幫助,將不勝感激。

回答

0

找出我錯過的東西。對於任何可能遇到同樣問題的人,我將這個答案放在這裏。我需要將所有的FK變成PK FK(因爲他們不允許爲空)。這有點煩人,因爲如果你有更復雜的樹,你必須管理的密鑰數量會隨着你越來越深而增長。

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

如果有人有關於如何縮短管理密鑰的想法請留下一個答案。因爲這可能不是最好的解決方案。