实体框架多对多关系错误

本文关键字:错误 关系 实体 框架 | 更新日期: 2023-09-27 18:15:24

我有两个类:

public class Cluster
{
    public int Id { get; set; }
    public virtual ICollection<Blob> Blobs { get; set; }
}
public class Blob
{
    public int Id { get; set; }
    public virtual ICollection<Cluster> Clusters { get; set; }
}
public ClusterConfiguration ()
{
    this.HasKey(p => p.Id)
        .HasRequired(p => p.Frame)
        .WithMany(p => p.Clusters)
        .HasForeignKey(p => p.FrameId)
        .WillCascadeOnDelete(true)
        ;
    this.HasMany(p => p.Blobs)
        .WithMany(p => p.Clusters)
        ;
}
public BlobConfiguration ()
{
    this.HasKey(p => p.Id)
        .HasRequired(p => p.Frame)
        .WithMany(p => p.Blobs)
        .HasForeignKey(p => p.FrameId)
        .WillCascadeOnDelete(true)
        ;
    this.HasMany(p => p.Clusters)
        .WithMany(p => p.Blobs)
        ;
}

在这些类中有对其他表的引用,但我认为这不是问题所在。错误是:

[{"Introducing FOREIGN KEY constraint 'FK_dbo.ClusterBlobs_dbo.Blob_Blob_Id' on table 'ClusterBlobs' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.'r'nCould not create constraint. See previous errors."}].

我不太确定如何告诉EF级联删除blob,如果集群被删除,但不删除集群,如果blob被删除。请建议。

更新:顺便使用EF5

实体框架多对多关系错误

如果您删除Frame,而不是ClusterBlob,则多重级联删除路径实际上是有效的:

  • Frame被删除->级联到Clusters ->级联到链接表
  • Frame被删除->级联到Blobs ->级联到链接表

所以,这是从Frame到链接表的两条路径。

我建议禁用从FrameClusterBlob的两个(或两个)关系之一的级联删除。(此处使用WillCascadeOnDelete(false)。)不能在单个关系的基础上禁用链接表的级联删除。唯一的方法是全局禁用约定:

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

但是这会影响模型中的所有多对多关系。

我不太确定如何告诉EF级联删除blob如果集群

如果blob被删除,则不删除cluster。

这是不可能的。在ClusterBlob之间没有级联删除,因为从数据库的角度来看,多对多关系实际上是用两个一对多关系建模的,中间有一个链接表。级联删除只作用于关系中依赖的链接表。ClusterBlob都是主体

我认为全局关闭ManyToManyCascadeDeleteConvention不是一个明智的选择。相反,最好只对相关的表关闭

这可以通过编辑属性 cascadeDelete 生成的迁移文件来实现。例如:

AddForeignKey("dbo.ClusterBlobs", "Blob_Id", "dbo.Blob", "Blob_Id", cascadeDelete: false);