5

を削除することはできません私はこのエラーを取得する:EF - カスケードが機能していない削除、オブジェクト

System.Data.SqlClient.SqlException The DELETE statement conflicted with the REFERENCE constraint "FK_comments_postId__164452B1". The conflict occurred in database "awe", table "dbo.comments", column 'postId'. The statement has been terminated.

私はこの構造を有する:

public class Post 
    { 
     public long Id { get; set; } 
     public string Body { get; set; }  

     public long? ParentId { get; set; } 
     public virtual Post Parent { get; set; } 
     public virtual ICollection<Post> Posts { get; set; } 

     public virtual ICollection<Comment> Comments { get; set; } 
    } 

    public class Comment 
    { 
     public long Id { get; set; } 
     public long PostId { get; set; } 
     public virtual Post Post { get; set; } 
     public string Body { get; set; } 
    } 

私の削除方法:

public void Delete(long id) 
    { 
     var p = context.Set<Post>().Get(id); 
     if(p == null) throw new MyEx("this post doesn't exist"); 
     if (p.Posts.Count > 0) throw new MyEx("this post has children and it cannot be deleted"); 
     context.Set<Post>().Remove(p); 
     context.SaveChanges(); 
    } 

を私のDbContext:

public class Db : DbContext 
{ 
    public DbSet<Post> Posts { get; set; } 
    public DbSet<Comment> Comments { get; set; } 
} 

答えて

20

あなたが削除しようとしている投稿が子供コメントを持っているようです。

Entity Frameworkは、データベース内の削除をカスケードすることについて責任を負いません。これは、RDBMSの外部キー関係のカスケード削除を設定することで実現します。

これは、Entity Frameworkの親エンティティを削除すると、現在のDbContextに読み込まれた子エンティティに対してdeleteステートメントを発行しようとしますが、まだ実行されていない子エンティティは初期化されません読み込まれました。カスケード削除が指定されていない場合、RDBMSが外部キー制約違反例外をスローする可能性があります。カスケード削除がEntity Frameworkでどのように機能するかについては、see this blog postを参照してください。

関連する問題