实体框架6代码优先级联删除自引用实体

本文关键字:实体 级联 删除 自引用 框架 代码 | 更新日期: 2023-09-27 17:53:46

我有一个实体:

public class Section : SortableEntity
{
    private ICollection<Section> _sections;
    public ICollection<Section> Sections
    {
        get
        {
            return _sections ?? (_sections = new HashSet<Section>());
        }
        set
        {
            _sections = value;
        }
    }
    public string Title { get; set; }
    public string Description { get; set; }
    public Section ParentSection { get; set; }
    public int? ParentSectionId { get; set; }
}

在创建模型时,我有一个配置:

modelBuilder.Entity<Section>().HasOptional(x => x.ParentSection).WithMany(p => p.Sections).HasForeignKey(d => d.ParentSectionId);

我正在尝试进行级联删除,我得到以下错误:" DELETE语句与同一个表引用约束"FK_dbo.Section_dbo.Section_ParentSectionId"冲突。

如何在自引用实体上配置级联删除?

实体框架6代码优先级联删除自引用实体

如果你谷歌你的问题,你会看到一个无数的其他人有同样的问题,原因是因为SQL Server不能处理级联删除对自我引用的实体,我发现没有解决方案内的实体框架,它只是通过设置一些属性。我所知道的首先使用代码模拟自引用实体上的级联删除的唯一方法是编写一个递归方法,该方法在收集主键、外键和递归信息级别时遍历子节点。一旦建立了这个列表,按递归级别降序进行循环,在每次迭代中,您将获得该递归级别的所有记录,循环遍历该集合并一次删除它们。为此,我使用了一个存储过程,该过程使用递归公共表表达式返回该列表。