我有一个实体,它有两个实现多对多关系的子集合。
错误:引入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中的多对多关联。
答案 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);