Arthur Vickers定义规则时DetectChanges
并不需要被调用(即使不是之前SaveChanges
)in this blog post:
到EF代码没有呼叫将离开上下文在 DetectChanges需要被调用的状态如果之前不需要叫 。
关于添加和删除这些都是“EF代码”的方法,因为你要么打电话Add
或Delete
或您的context.Entry(entity).State
状态设置为Added
或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。
而且我觉得你其实需要DetectChanges
前SaveChanges
如果你只是遍历一些实体只有一个单呼,它们加载到或将它们连接到上下文和改变一些(标量和复杂)属性值。
如果你做更复杂的东西(也许关系改变?或其他?)你的方法可能不是安全了,因为
AutoDetectChanges
不会在它的方式来实现,并呼吁在许多EF方法是否会SaveChanges
是之前提到的是只有一次正确的必要in the same blog post再次证明
如果代码使改变而改变对实体 的属性,而不是只调用添加或附加,然后,由规则2,DetectChanges 将需要被调用,至少作为SaveChanges 的一部分并且还可能在之前也可以调用 。
(从我高亮)
不幸的是我不知道的代码在早期阶段进行比对之前SaveChanges
需要调用DetectChanges
时,将显示一个例子。但是因为上面的第一点,我相信这样的例子存在。
不是100%确定它是否在背景中有任何奇怪的现象,但我一直在使用类似的方法,但没有发现任何不良副作用 – Thewads 2013-03-11 16:05:15