2017-12-30 31 views
0

私は、エンティティフレームワークのコア・ソリューションで、.NETのコア2のために単純化されたスキーマを次ていますカスケードが一対多でEntity Frameworkのコアを使用するすべての子を削除して、多対多の関係

  1+--------+1 
    +-------+Blogs +-------+ 
    |  +--------+  | 
    *|      |* 
+--------+    +----------+ 
|Posts |    |Tags  | 
+--------+    +----------+ 
    |1      1| 
    | *+-------------+* | 
    +----+PostTags |------+ 
     +-------------+ 

以下でモデル:

public class Blog 
{ 
    public int Id { get; set; } 

    public ICollection<Post> Posts { get; set; } 
    public ICollection<Post> Tags { get; set; }  
} 

public class Post 
{ 
    public int Id { get; set; } 

    public Blog Blog { get; set; } 
    public ICollection<PostTag> PostTags { get; set; }  
} 

public class Tag 
{ 
    public int Id { get; set; } 

    public Blog Blog { get; set; } 
    public ICollection<PostTag> PostTags { get; set; }  
} 

public class PostTag 
{ 
    public int PostId { get; set; } 
    public Post Post { get; set; } 

    public int TagId { get; set; } 
    public Tag Tag { get; set; } 
} 

と、対応するDbContext:

public class DataDbContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<Tag> Tags { get; set; } 
    public DbSet<PostTag> PostTags { get; set; }  
} 

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<PostTag>() 
     .HasKey(u => new { pt.TagId, pt.PostId }); 

    modelBuilder.Entity<PostTag>() 
     .HasOne(pt => pt.Post) 
     .WithMany(p => p.PostTags) 
     .HasForeignKey(pt => pt.PostId) 
     .OnDelete(DeleteBehavior.Cascade) 
     .IsRequired(); 

    modelBuilder.Entity<PostTag>() 
     .HasOne(pt => pt.Tag) 
     .WithMany(t => t.PostTags) 
     .HasForeignKey(pt => pt.TagId) 
     .OnDelete(DeleteBehavior.Cascade) 
     .IsRequired(); 
} 

カスケードはWORを削除ksですが、Tagsにはブログが残っています。ブログのタグが[Require]の場合、循環制約エラーが発生します。

私はちょうど答え自分自身見つけたと思う:SQL Serverでは、」

を、表がDELETE のいずれかによって開始され すべてのカスケード参照動作のリスト中に2回以上出現することはできませんまたはUPDATEステートメント。例えば、カスケード 参照動作のツリーは、は 上の特定のテーブルにカスケード参照動作ツリーを1つのパスを持っている必要があります

からweblogs.asp.net

EFコアでは、ブログが削除されるとすぐにすべてのタグと投稿が削除されるようにするための洗練されたソリューションがありますか?

+0

ブログからのカスケード削除パスは定義されていませんが、「ミドル」テーブルからのパスのみが定義されています。それは意図的なのでしょうか?ただし、複数のカスケード削除パスは非常に危険ですので、注意して使用してください。 – DevilSuichiro

+0

どのように見えるでしょうか?私はメッセージを受け取り続けます: 'サイクルや複数のカスケード経路を引き起こす可能性があります。 'NO DELETE NO ACTIONまたはON NO NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。' – Alx

答えて

1

EFコアでは、ブログが削除されるとすぐにすべてのタグと投稿が削除されるようにするための洗練されたソリューションがありますか?

あなたの2つのオプションがあります。

1)は、その後のブログを削除し、Posts-> PostTagsカスケード削除削除してBlogs-> BlogTagsカスケードしており、最初にすべてのブログの投稿を削除します。

2)ブログを削除する前に関連する投稿とブログタグを削除するには、ブログにINSTEAD OF DELETEトリガーを書き込んでください。

+0

オプションを提供してくれてありがとうございます。最初のアプローチは、 – Alx

関連する問題