使用实体框架进行级联删除

时间:2015-06-02 22:27:44

标签: c# entity-framework

我有一个评论表,其中包含列Id - 评论的ID,Commenter_Id发布它的用户的ID以及ParentComment_Id自我引用外键。评论,父母和子评论只有两个级别。如果评论记录的ParentComment_Id为null,那么它就是父评论。

我试图编写一个表达式来删除用户的所有注释,但由于我之前提到过的自我引用,这会导致问题。

将此记录示例作为问题的示例:

ID为2的用户发布了一条评论,ID为3.因为这是父评论,所以ParentComment_Id值为null。稍后,ID为1的用户通过子评论响应该评论,创建评论7(这两者之间还有其他评论/子评论,因此Id增量跳跃)。

我无法删除评论ID 3,因为子评论,评论ID 7,有一个外键。

目前我尝试删除评论的Entity Framework声明如下:

context.Comments.Where(x => x.Commenter.Id == user.Id).Delete();

但由于所描述的问题,这给了我一个例外。

我可以使用一些foreach循环修复此问题,但我希望有一种更简单的方法,如context.Cascade().Where(...。对于那些想知道Delete()方法是EntityFramework.Extended包的一部分的人。

2 个答案:

答案 0 :(得分:3)

如果您有这样的实体:

public class Comment
{
  public int Id{get;set;}
  public int? ParentCommentId{get;set;}

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

您可以尝试使用此配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Comment>()
                .HasOptional(c=>c.ParentComment)
                .WithMany(c=>c.Comments)
                .HasForeignKey(c => c.ParentCommentId) 
                .WillCascadeOnDelete(true);
}

您可以使用WillCascadeOnDelete方法在关系上配置级联删除。如果从属实体上的外键可以为空,则Code First 不会设置级联删除关系,当删除主体时,外键将被设置为空。

答案 1 :(得分:1)

您可以尝试将其添加到dbcontext

map