C# 实体框架多个组合键,删除时级联

C# 实体框架多个组合键,删除时级联,c#,entity-framework,ef-code-first,composite-key,C#,Entity Framework,Ef Code First,Composite Key,我在EntityFramework中3个表之间配置复合键时遇到了一些问题,代码优先的方法。我有一个具有Id的基类,我的所有类都从该Id继承。第一个表包含第二个表项的集合,而它包含第三个表项的集合。当从两个表中删除一个元素时,我需要复合键用于在删除时级联。我还使用了聚合根模式 public abstract class BaseClass { [Key, Column(Order = 0)] [DatabaseGenerated(DatabaseGeneratedOptio

我在EntityFramework中3个表之间配置复合键时遇到了一些问题,代码优先的方法。我有一个具有Id的基类,我的所有类都从该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; }
}
公共抽象类基类
{
[键,列(顺序=0)]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共长Id{get;set;}
}
公共类表1:基类
{        
公共虚拟ICollection Table2集合{get;set;}
公共字符串名称{get;set;}
}
公共类表2:基类
{   
公共表1表1{get;set;}
[键,外键(“表1”),列(顺序=1)]
公共长表1id{get;set;}
公共虚拟ICollection Table3集合{get;set;}
公共字符串名称{get;set;}
}
公共类表3:基类
{   
[键,外键(“表2ID,表1ID”),列(顺序=1)]
公共表2表2{get;set;}
公共长表2id{get;set;}
公共长表1id{get;set;}
公共字符串名称{get;set;}
}
当我删除表1或表2类型的元素时,上面的代码可以正常工作,但它不允许我从表3中删除元素,这给了我以下异常:

无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关的外键属性设置为null值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。”

下面是我的模型生成器:

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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.has必需(x=>x.Table1)
.WithMany(x=>x.Table2集合)
.WillCascadeOnDelete(真);
modelBuilder.Entity()
.has必需(x=>x.Table2)
.WithMany(x=>x.Table3集合)
.WillCascadeOnDelete(真);
}

我怀疑我可能没有正确配置model builder,但我似乎不知道如何配置它以允许删除Table3类型的元素。如果您能提供任何帮助,我将不胜感激。

找出了我所缺少的内容。我在这里为可能遇到与我相同问题的任何人提供此答案。我需要做一些准备l FK变为PK FK(因为它们不允许null)。这有点令人恼火,因为如果你有一个更复杂的树,你必须管理的密钥数量会随着你走得越深而增加

modelBuilder.Entity<Table3>().HasKey(m => new {m.Id, m.Table2Id, m.Table1Id});
modelBuilder.Entity().HasKey(m=>new{m.Id,m.Table2Id,m.Table1Id});
如果有人对如何缩短要管理的密钥数量有想法,请留下答案。因为这可能不是最好的解决方案