一对多关系:将子项标记为已修改而不是删除

时间:2019-07-08 07:54:32

标签: entity-framework-core

在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); 

1 个答案:

答案 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。