Arthur Vickers 定义了一个规则,当DetectChanges 不需要被调用时(甚至在SaveChanges 之前)in this blog post:
不调用 EF 代码将使上下文处于以下状态
如果不需要调用 DetectChanges 则需要调用
之前。
关于 Add 和 Delete 这些是“EF 代码”方法,因为您要么调用 Add 或 Delete,要么将 context.Entry(entity).State 的状态设置为 @ 987654330@ 或Deleted。因此,如果您只是遍历一堆实体并添加或删除它们,那么您根本不需要调用 DetectChanges。
关于编辑,我相信它更微妙一些。当您使用以下任一方式更新实体时...
context.Entry(entity).CurrentValues.SetValues(someObject);
...或使用DbContext...的属性API...
context.Entry(entity).Property(e => e.SomeProperty).CurrentValue = someValue;
...那么您也不需要DetectChanges(即使在SaveChanges 之前也不需要),因为这些又是对“EF 代码”的调用。
如果您只是更改实体的属性值,例如...
entity.SomeProperty = someValue;
...那么上面链接的第二条规则in the same blog post 适用:
任何时候非 EF 代码更改实体的任何属性值或
复杂对象,则可能需要调用 DetectChanges。
我认为你实际上只需要在SaveChanges 之前调用一次DetectChanges 如果你只是循环一些实体,将它们加载或附加到上下文并更改一些(标量和复数)属性值。
如果你做更复杂的事情(也许关系改变?或其他什么?)你的方法可能不再安全,因为
AutoDetectChanges 不会以它现在的方式实现,并且如果在 SaveChanges 之前只需要一次,则在许多 EF 方法中调用它
-
再次提到in the same blog post
如果代码对实体的属性进行更改
而不是仅仅调用 Add 或 Attach,然后,根据规则 2,DetectChanges
将需要被调用,至少作为 SaveChanges 的一部分并且可能
也在之前然后。
(我的亮点)
不幸的是,我不知道在需要SaveChanges 之前调用DetectChanges 时会显示的代码示例。但是由于上面的第 1 点,我确信这样的例子是存在的。