2014-10-31 70 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}); 

如果有人有关于如何缩短管理密钥的想法请留下一个答案。因为这可能不是最好的解决方案。