我有一个评论表,其中包含列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包的一部分的人。
答案 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