0

我有两节课:

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。

4

2 回答 2

1

Frame如果您删除 a ,而不是 aCluster或,则多个级联删除路径实际上是有效的Blob

  • Frame被删除 -> Cascades to Clusters-> Cascades to link table
  • Frame被删除 -> Cascades to Blobs-> Cascades to link table

因此,这是从链接表到链接表的两条路径Frame

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

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

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

我不太确定如何告诉 EF 如果删除集群则级联删除 Blob,但如果删除 Blob,则不删除集群。

这是不可能的。和之间没有级联删除ClusterBlob因为从数据库的角度来看,多对多关系实际上是用两个一对多关系建模的,两者之间的链接表。级联删除仅作用于关系中依赖的链接表。Cluster并且Blob都是校长。

于 2013-05-27T10:40:58.093 回答
0

我认为在全球范围内关闭ManyToManyCascadeDeleteConvention并不是一个明智的选择。相反,最好只为相关表关闭它。

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

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

于 2017-12-06T13:25:16.837 回答