Entity framework core EF核心级联删除需要包含,然后包含映射

Entity framework core EF核心级联删除需要包含,然后包含映射,entity-framework-core,cascade,cascading-deletes,ef-core-2.0,ef-core-2.1,Entity Framework Core,Cascade,Cascading Deletes,Ef Core 2.0,Ef Core 2.1,我有三个类,它们的关系定义为 定义(有许多)->(引用返回)节(有许多)->(引用返回)字段 一个定义有许多节,节属于一个定义。节和字段也是如此 public class Definition { public long Id { get; set; } public string Name { get; set; } public virtual ICollection<Section> Sections { get; } = new List<S

我有三个类,它们的关系定义为

定义(有许多)->(引用返回)节(有许多)->(引用返回)字段

一个定义有许多节,节属于一个定义。节和字段也是如此

public class Definition
{
    public long Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<Section> Sections { get; } = new List<Section>();
}
我得到一个例外:

DELETE语句与引用约束“FK__Section__Definit__2E1BDC42”冲突。冲突发生在数据库“EFCoreDB”、表“dbo.Section”、列“DefinitionId”中

然而,如果我这样做

var loading = context.Definition
            .Include(x => x.Sections).ThenInclude(s => s.Fields)
            .Include(x => x.Sections).ThenInclude(s => s.Products)
            .FirstOrDefault(x => x.Name == "Loading");

if (loading != null) context.Remove(loading);
context.SaveChanges();
它毫无问题地工作

我不知道为什么所有的Include()和Include()业务都是必要的

发生了什么事?为什么级联删除不能识别外键依赖项和必需的删除选项


谢谢您的回答。

您可以尝试从中删除
virtual
吗relations@viveknuna例如我试了两种方法。仍然是相同的结果。显然数据库与映射不匹配。特别是,从
定义
的FK约束在删除级联上没有
。根据约束的名称,我假设您没有使用EF Core迁移来维护数据库模式。在这种情况下,您应该手动更新数据库以匹配映射。谢谢Ivan。没有办法避免数据库中的On-Delete级联条目吗?假设DB是共享的,我不想在其他程序上强加任何东西。我认为放置.OnDelete(…)子句将导致EF理解它是必需的。
builder.Entity<Definition>()
            .HasMany(d => d.Sections)
            .WithOne(s => s.Definition)
            .HasForeignKey(s => s.DefinitionId)
            .IsRequired()
            .OnDelete(DeleteBehavior.Cascade);
var loading = context.Definition
            .FirstOrDefault(x => x.Name == "Loading");

if (loading != null) context.Remove(loading);
context.SaveChanges();
var loading = context.Definition
            .Include(x => x.Sections).ThenInclude(s => s.Fields)
            .Include(x => x.Sections).ThenInclude(s => s.Products)
            .FirstOrDefault(x => x.Name == "Loading");

if (loading != null) context.Remove(loading);
context.SaveChanges();