我收到此错误:
System.Data.SqlClient.SqlException DELETE语句发生冲突 使用REFERENCE约束“FK_ comments _postId__164452B1”。该 数据库“awe”,表“dbo.comments”,列中发生冲突 “帖子ID”。声明已经终止。
我有这个结构:
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; }
}
答案 0 :(得分:25)
听起来你要删除的帖子有子评论。
实体框架不负责在数据库中级联删除 - 它希望您通过在RDBMS中的外键关系上设置级联删除来实现此目的。
话虽如此,如果删除Entity Framework中的父实体,它将尝试为已加载到当前DbContext 的任何子实体发出delete语句,但它不会初始化任何具有的实体尚未加载。如果未指定级联删除(例如您所看到的级联删除),这可能会导致RDBMS抛出外键约束违例异常。有关级联删除如何在“实体框架”中工作的更多详细信息,请see this blog post。