级联删除似乎在 EF Core 3 中对我不起作用

Cascade Deletion doesn't seem to work for me in EF Core 3

我有一个 Entity Framework 混合项目,其中有几个相关的 table。

我已经在数据库和 dbcontext 中适当地创建了带有级联删除的外键,但是当我 运行 对 API 的删除调用时,相关数据被孤立而不是已删除。

过去几天我读到的所有内容都表明这应该有效。我更喜欢数据库来处理这个工作负载,而不是在代码中手动完成它们。

我的外键命名约定与我的 dbcontext 中的内容匹配,逻辑也是如此,据我所知。基本结构是此 API 存储 运行ning 报告的配置。作为 1+ 个存储过程且具有 n 个参数的报表。没有连接的报表,存储过程记录不应存在,同样,如果没有连接的存储过程,每个参数也不应存在。

以下是存储过程 (Sprocs) 的 Fluent API 的一部分。

        entity.HasOne(d => d.Report)
            .WithMany(p => p.Sprocs)
            .HasForeignKey(d => d.ReportId)
            .IsRequired()
            .OnDelete(DeleteBehavior.Cascade)
            .HasConstraintName("FK_Sprocs_Reports");

        entity.HasOne(d => d.ServerInfo)
            .WithMany(p => p.Sprocs)
            .HasForeignKey(d => d.ServerInfoId)
            .IsRequired()
            .HasConstraintName("FK_Sprocs_UsableSchema");

来自 SQL 服务器的脚本外键如下:

ALTER TABLE [dbo].[Sprocs]  WITH NOCHECK ADD  CONSTRAINT [FK_Sprocs_Reports] FOREIGN KEY([ReportId])
REFERENCES [dbo].[Reports] ([ID])
ON DELETE CASCADE
GO

我们确实在 Core 2.2 中启动了这个项目,后来在项目周期中升级到 3.0,我意识到 Cascades 有一些重大变化,但我的理解(可能有缺陷)是操作顺序是唯一的OnDelete 行为发生了变化。

None 的级联正在工作,尽管我只有几个。我有 User => UserGroupXREF 所以如果我删除给定的用户我需要删除它的专有组以及 XREF table 中的关系映射。我很确定那将是两个 calls/steps.

我似乎找不到任何迹象表明我的设置不正确,但我的 Google-Fu 之前在搜索词选择方面失败了。

感谢您的帮助。

您的外键约束设置为 NOCHECK。这阻止了强制执行外键,从而导致 DELETE CASCADE 没有发生。

您可以通过运行以下命令重新启用约束:

ALTER TABLE [dbo].[Sprocs] CHECK CONSTRAINT [FK_Sprocs_Reports]