Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何配置具有实现多对多关系的两个子集合的实体?_C#_Entity Framework - Fatal编程技术网

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

C# 如何配置具有实现多对多关系的两个子集合的实体?,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

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

错误:在表“ClassCClassBs”上引入外键约束“FK_dbo.ClassCClassBs_dbo.ClassBs_ClassB_Id”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束。请参阅前面的错误

使用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; }
}
此外,我还重写了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);