0

私は2つのクラスを持っています:

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."}].

クラスターが削除された場合に Blob をカスケード削除するように EF に指示する方法がよくわかりませんが、Blob が削除された場合にクラスターを削除しないようにします。お知らせ下さい。

更新:ちなみにEF5を使用しています。

4

2 に答える 2

1

orFrameではなく aを削除すると、複数のカスケード削除パスが実際に有効になります。ClusterBlob

  • Frameは削除されます -> カスケード先Clusters-> リンク テーブルにカスケードします
  • Frameは削除されます -> カスケード先Blobs-> リンク テーブルにカスケードします

したがって、これらはFrameリンク テーブルへの 2 つのパスです。

FrametoClusterまたはの 2 つの関係のいずれか (または両方) のカスケード削除を無効にすることをお勧めしBlobます。(そこで使用WillCascadeOnDelete(false)してください。) リンク テーブルのカスケード削除を無効にすることは、個々の関係ベースではできません。唯一の方法は、規則をグローバルに無効にすることです。

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

ただし、これはモデル内のすべての多対多の関係に影響します。

クラスターが削除された場合に Blob をカスケード削除するように EF に指示する方法がよくわかりませんが、Blob が削除された場合にクラスターを削除しないようにします。

ちなみにこれはありえない。Clusterと の間にカスケード削除はありません。これはBlob、データベースの観点から見ると、多対多の関係は実際にはリンク テーブルを間に挟んだ 2 つの 1 対多の関係でモデル化されているためです。カスケード削除は、リレーションシップで依存しているリンク テーブルに対してのみ機能します。ClusterでありBlob、どちらもプリンシパルです。

于 2013-05-27T10:40:58.093 に答える