C# 如何配置具有实现多对多关系的两个子集合的实体?
我有一个实体,它有两个子集合,实现了多对多关系 错误:在表“ClassCClassBs”上引入外键约束“FK_dbo.ClassCClassBs_dbo.ClassBs_ClassB_Id”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束。请参阅前面的错误 使用EF 6C# 如何配置具有实现多对多关系的两个子集合的实体?,c#,entity-framework,C#,Entity Framework,我有一个实体,它有两个子集合,实现了多对多关系 错误:在表“ClassCClassBs”上引入外键约束“FK_dbo.ClassCClassBs_dbo.ClassBs_ClassB_Id”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束。请参阅前面的错误 使用EF 6 public class ClassA { public int Id { get; set; } public virtual ICollec
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; }
}
此外,我还重写了OnModelCreated以配置新类,并仅将cascadedelete设置为其中一个关联
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);
}
}
公共类ClassContext:DbContext
{
public ClassContext():基(“DefaultConnection”)
{
}
公共数据库集类{get;set;}
公共数据库集类B{get;set;}
公共数据库集ClassCs{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasKey(c=>new{c.ClassBId,c.ClassCId});
modelBuilder.Entity().HasMany(c=>c.ClassBClassCs).WithRequired(c=>c.ClassB).HasForeignKey(c=>c.ClassBId).WillCascadeOnDelete(true);
modelBuilder.Entity().HasMany(c=>c.ClassBClassCs).WithRequired(c=>c.ClassC).HasForeignKey(c=>c.ClassCId).WillCascadeOnDelete(false);
}
}
当我删除实体A时,此修改将级联删除实体B和C。唯一需要记住的是,删除实体C时,我必须手动删除实体C中的多对多关联。您需要覆盖
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);
modelBuilder.Entity()
.HasRequired(p=>p.ClassA)
.WithMany(p=>p.classb)
.HasForeignKey(p=>p.ClassAId)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.HasRequired(p=>p.ClassA)
.WithMany(p=>p.ClassCs)
.HasForeignKey(p=>p.ClassAId)
.WillCascadeOnDelete(假);
你用的是EF Core吗?不是。用的是EF 6。看一看:我看过上面提到的帖子。我希望能够以一种方式配置它,当我删除实体a时,实体b以及与其相关的多对多实体一起删除。我添加并编辑了一个可能的解决方案,该解决方案取自我在上所读的内容。是否有方法在我删除实体a时将实体b和C删除?将值设置为true
而不是。WillCascadeOnDelete(false)
我相信按照惯例,级联删除设置为true,但让我尝试将其显式配置为true,然后我将进行更新。我添加了一个更新,并提供了可能的解决方案。您的答案只能通过在实体A中的一个集合关联上设置cascade delete来实现,但我必须记住,在删除其余关联之前,先手动删除另一个关联。
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);