首页 > 解决方案 > 删除 EF 核心 (SQL Server) 中的级联树

问题描述

我有以下代码:

    public class A
    {
        public Guid Id { get; set; }
        public List<A> AList { get; set; }
    }

使用流利的 Api 配置:

            modelBuilder
                .Entity<A>()
                .HasMany(x => x.AList)
                .WithOne()
                .OnDelete(DeleteBehavior.Cascade);

创建迁移工作正常,但在执行“更新数据库”时出现以下错误:

“在表 'A' 上引入 FOREIGN KEY 约束 'FK_A_A_AId' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。 "

那么如何删除 EF Core 中的级联树呢?

标签: c#sql-serverentity-framework-core.net-5ef-core-3.0

解决方案


你不能“自动”级联删除;您必须递归地删除客户端代码中的子记录或使用递归 CTE 在数据库中创建INSTEAD OF DELETE触发器以查询和删除所有子记录

SO回答递归删除客户端代码中的孩子:

在 EF Core 2 的自引用表中实现级联删除

所以触发器的答案:

关于自引用表的删除级联

或者,将触发器逻辑实现为存储过程,并将 EFCore 配置为使用该存储过程进行删除(不是像 EF6 这样的内置功能,MapToStoredProcedures因此需要付出一些努力:

EF Core - EF Core 3.1 或 5 中的 MapToStoredProcedures 替换是什么


推荐阅读