EF核心级联删除功能需要包含,包括映射后仍包含

时间:2018-07-19 20:20:14

标签: entity-framework-core cascade cascading-deletes ef-core-2.0 ef-core-2.1

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

定义(有很多)->(引用很多)Section(有很多)->(引用很多)字段

一个定义有许多节,而各节属于一个定义。对于“节和字段”也是如此。

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

    public string Name { get; set; }

    public virtual ICollection<Section> Sections { get; } = new List<Section>();
}

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

    public string Name { get; set; }

    public long DefinitionId { get; set; }

    public virtual Definition Definition { get; set; }

    public virtual ICollection<Field> Fields { get; } = new List<Field>();

    public virtual ICollection<Section_Product> Products { get; } = new List<Section_Product>();
}

部分在数据库中也定义了 DefinitionId 外键。如果需要,请忽略“字段”部分。我想要做的是在删除“定义”时能够级联删除“节”。

为此,我使用

将它们彼此链接
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();

我收到此异常:

  

DELETE语句与REFERENCE约束“ 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()和ThenInclude()业务都是必要的。

这是怎么回事?为什么级联删除无法识别外键依赖性和必需的删除选项?

谢谢您的回答。

0 个答案:

没有答案