我有三个类,它们的关系定义为
定义(有很多)->(引用很多)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()业务都是必要的。
这是怎么回事?为什么级联删除无法识别外键依赖性和必需的删除选项?
谢谢您的回答。