5

tôi nhận được lỗi này:EF - Cascade Xóa không làm việc, không thể xóa Object

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.

Tôi có cấu trúc này:

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; } 
    } 

phương pháp xóa của tôi:

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(); 
    } 

my DbContext:

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

Trả lời

20

Có vẻ như Bài đăng mà bạn đang cố xóa có Nhận xét con.

Khuôn khổ thực thể sẽ không chịu trách nhiệm về việc xếp tầng xóa trong cơ sở dữ liệu - nó hy vọng rằng bạn sẽ đạt được điều này bằng cách đặt xóa tầng trên mối quan hệ khóa ngoài trong RDBMS. Sau khi nói điều này, nếu bạn xóa một thực thể cha trong Entity Framework, nó sẽ cố gắng phát hành các câu lệnh xóa cho bất kỳ thực thể con nào đã được tải vào DbContext hiện tại, nhưng nó sẽ không khởi tạo bất kỳ thực thể con nào chưa đã được tải. Điều này có thể dẫn đến RDBMS ném các ngoại lệ vi phạm ràng buộc khóa ngoại nếu việc xóa tầng đã không được chỉ định, giống như việc bạn đang nhìn thấy. Để biết thêm chi tiết về cách xóa tầng "hoạt động" trong Entity Framework, see this blog post.

Các vấn đề liên quan