如何配置具有两个实现多对多关系的子集合的实体?

时间:2017-03-28 16:52:31

标签: c# entity-framework

我有一个实体,它有两个实现多对多关系的子集合。

错误:引入FOREIGN KEY约束' FK_dbo.ClassCClassBs_dbo.ClassBs_ClassB_Id'在桌子上' ClassCClassBs'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。

使用EF 6

public class ClassA
{
    public int Id { get; set; }
    public virtual ICollection<ClassB> ClassBs { get; set; }
    public virtual ICollection<ClassC> ClassCs { get; set; }
}

public class ClassB
{
    public int Id { get; set; }
    public int ClassAId { get; set; }
    public virtual ClassA ClassA { get; set; }
    public virtual ICollection<ClassC> ClassCs { get; set; }
}

public class ClassC
{
    public int Id { get; set; }
    public int ClassAId { get; set; }
    public virtual ClassA ClassA { get; set; }
    public virtual ICollection<ClassB> ClassBs { get; set; }
}

编辑:我想以一种方式配置它,当实体A被删除时,实体B和C也被删除,包括它们关联的多对多关联。

更新:

我创建了另一个代表B类和C类多对多关联的类。

来自How to create a many-to-many mapping in Entity Framework?

的想法
public class ClassBClassC
{
    public int ClassBId { get; set; }
    public int ClassCId { get; set; }
    public virtual ClassB ClassB { get; set; }
    public virtual ClassC ClassC { get; set; }
}

此外,我覆盖OnModelCreated以配置新类,并仅将级联删除设置为其中一个关联。

 public class ClassContext : DbContext
{
    public ClassContext() : base("DefaultConnection")
    {
    }
    public DbSet<ClassA> ClassAs { get; set; }
    public DbSet<ClassB> ClassBs { get; set; }
    public DbSet<ClassC> ClassCs { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ClassBClassC>().HasKey(c => new { c.ClassBId, c.ClassCId });
        modelBuilder.Entity<ClassB>().HasMany(c => c.ClassBClassCs).WithRequired(c => c.ClassB).HasForeignKey(c => c.ClassBId).WillCascadeOnDelete(true);
        modelBuilder.Entity<ClassC>().HasMany(c => c.ClassBClassCs).WithRequired(c => c.ClassC).HasForeignKey(c => c.ClassCId).WillCascadeOnDelete(false);
    }
}

当我删除实体A时,此修改将级联删除实体B和C.唯一要记住的是,我必须在删除时手动删除实体C中的多对多关联。

1 个答案:

答案 0 :(得分:0)

您需要覆盖OnModelCreating方法并指定表之间的关系:

modelBuilder.Entity<ClassB>()
    .HasRequired(p => p.ClassA)
    .WithMany(p => p.ClassBs)
    .HasForeignKey(p => p.ClassAId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<ClassC>()
    .HasRequired(p => p.ClassA)
    .WithMany(p => p.ClassCs)
    .HasForeignKey(p => p.ClassAId)
    .WillCascadeOnDelete(false);