实体框架多个复合键,级联删除

时间:2014-10-31 08:38:00

标签: c# entity-framework ef-code-first composite-key

我在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类型的元素,但它不允许我从Table3中删除元素,给出以下异常:

“由于一个或多个外键属性不可为空,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为空值。 -key不支持空值,必须定义新关系,必须为foreign-key属性分配另一个非空值,或者必须删除不相关的对象。“

贝娄是我的模特建造者:

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类型的元素。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

弄清楚我错过了什么。我正在把这个答案放在任何可能碰到同样问题的人身上。我需要将所有FK变成PK FK(因为它们不允许null)。这有点烦人,因为如果你有一个更复杂的树,你需要管理的密钥数量会随着你越来越深而增长。

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

如果有人知道如何缩短要管理的密钥数量,请留下答案。因为这可能不是最好的解决方案。