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