Entity framework core 一对多关系:子项标记为“修改”,而不是“删除”

Entity framework core 一对多关系:子项标记为“修改”,而不是“删除”,entity-framework-core,Entity Framework Core,我在使用EntityFramework Core的一对多关系时遇到一些问题。当我在父对象的“列表”属性中删除子对象时,该子对象将被ChangeTracker标记为已修改(且未被删除)。但是,当我在上下文中调用SaveChanges时,这个实体会被完全删除 当然,我可以强制删除实体的标志,但我更喜欢另一种解决方案,因为我正在使用AutoMapper更新我的实体。我不想把AutoMapper映射过程和EntityFramework上下文混为一谈 var parent=new parent(); va

我在使用EntityFramework Core的一对多关系时遇到一些问题。当我在父对象的“列表”属性中删除子对象时,该子对象将被ChangeTracker标记为已修改(且未被删除)。但是,当我在上下文中调用SaveChanges时,这个实体会被完全删除

当然,我可以强制删除实体的标志,但我更喜欢另一种解决方案,因为我正在使用AutoMapper更新我的实体。我不想把AutoMapper映射过程和EntityFramework上下文混为一谈

var parent=new parent();
var child=new child();
parent.Childs.Add(child);
wait context.saveChangesSync();
//移除第一个孩子
父.子.移除(0);
//失败(预期已删除,已修改)
Assert.Equal(EntityState.Deleted,context.Entry(child.State));

对该行为的最佳解释包含在EF Core 3.0-中的一个预期突破性变化中:

旧行为

在3.0之前,EF Core应用的级联操作(在删除所需主体或切断与所需主体的关系时删除从属实体)在调用
SaveChanges
之前不会发生

新行为

从3.0开始,一旦检测到触发条件,EF Core就会应用级联动作。例如,调用
context.Remove()

为什么

进行此更改是为了改善数据绑定和审核场景的体验,在这些场景中,在调用
SaveChanges
之前了解哪些实体将被删除非常重要

第一部分解释了当前的行为,最后一部分解释了他们为什么要改变它——以帮助像您这样的使用场景

话虽如此,您应该手动应用级联选项,或者等待EF Core 3.0(如果您负担得起的话)