【问题标题】:Implementing Cascade Delete in a self referencing table in EF Core 2在 EF Core 2 的自引用表中实现级联删除
【发布时间】:2018-08-19 01:49:29
【问题描述】:

如何在 EF Core 2 的自引用表中实现级联删除(代码优先)?

(例如有一个评论表,一个人可以回复一个评论,这个回复可以由另一个人回复。)

public class Comment
{
    public virtual int Id { get; set; }
    public virtual int? ParentId { get; set; }
    public Comment Parent { get; set; }
    public virtual IList<Comment> Replies { get; set; }
    public virtual string Description { get; set; }
    public virtual Article Article { get; set; }
}

【问题讨论】:

  • 很快 - 你不能。这不是真正的 EF 限制,而是 MS SqlServer 限制,因此适用于所有 MS 开发的框架,包括 EF (Core)。您必须关闭级联删除(我认为默认情况下对于这种类型的关系)并手动删除相关记录或使用数据库触发器。
  • 一对多有一个解决方案。很可能,应该有一个解决方案。(mrshipley.com/2016/04/24/…) public class MyDBContext : DBContext { public DbSet Blog { get;放; } 公共 DbSet 帖子 { 获取;放; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasOne(p => p.Blog) .WithMany(b => b.Posts) .OnDelete(DeleteBehavior.Cascade); } }

标签: entity-framework entity-framework-core entity-framework-migrations cascade ef-core-2.0


【解决方案1】:

递归方法解决的问题:

[HttpPost]
public async Task<JsonResult> DeleteComment([FromBody] DeleteCommentViewModel obj)
{
    if (ModelState.IsValid)
    {
       var comment = await 
      _commentRepository.GetAll().SingleOrDefaultAsync(m => m.Id == obj.CommentId);
      if (comment != null)
      {
          await RemoveChildren(comment.Id);
         _commentRepository.Delete(comment);
      }
      if (Request.IsAjaxRequest())
      {
          return Json(1);
      }
   }
   return Json(new { code = 0 });
}


async Task RemoveChildren(int i)
{
    var children = await _commentRepository.GetAll().Where(c => c.ParentId = i).ToListAsync();
        foreach (var child in children)
    {
       await RemoveChildren(child.Id);
       _commentRepository.Delete(child);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 2018-08-29
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多