在EntityFramework Core中使用一对多关系时遇到一些麻烦。当我在父项的List属性中删除子项对象时,该子对象被ChangeTracker标记为“已修改”(而不是“已删除”)。但是,当我在上下文上调用SaveChanges时,此实体已被删除。
当然,我可以将实体的标志强制为Deleted,但是,我更喜欢另一种解决方案,因为我正在使用AutoMapper更新我的实体。而且我不想混合使用AutoMapper映射过程和EntityFramework Context。
var parent = new Parent();
var child = new Child();
parent.Childs.Add(child);
await context.SaveChangesAsync();
// removing the first child
parent.Childs.RemoveAt(0);
// fails (Expected Deleted, got Modified)
Assert.Equal(EntityState.Deleted, context.Entry(child).State);
答案 0 :(得分:1)
对此行为的最佳解释包含在EF Core 3.0的预期重大更改之一-Cascade deletions now happen immediately by default中:
旧行为
在3.0之前的版本中,直到调用
SaveChanges
时,EF Core才应用级联操作(当删除所需的委托人或与所需的委托人的关系断开时删除依赖实体)。新行为
从3.0开始,一旦检测到触发条件,EF Core就会应用级联操作。例如,调用
context.Remove()
删除主体实体将导致所有跟踪的相关必需依赖项也被立即设置为Deleted。为什么
进行此更改是为了改善数据绑定和审计方案的体验,在此情况下,重要的是要了解在调用
SaveChanges
之前将删除哪些实体。
第一部分说明了当前行为,最后一部分说明了为什么要更改它-以帮助像您这样的使用场景。
话虽如此,您应该手动应用级联选项,或者如果可以承受的话,请等待EF Core 3.0。