2012-06-18 89 views
6

當涉及到使用EF代碼第一次有兩個選項更改跟蹤:更改跟蹤差異用的DbContext和EF代碼第一次

基於更改跟蹤
  1. 快照
  2. 通知基於更改跟蹤與代理

使用每種更改跟蹤方法運行時請考慮以下代碼。假設一個帶有默認配置選項的DbContext實例。

var o = context.MySet.First(); 
o.MyProperty = 42; 
context.SaveChanges(); 

如果在第一行的上下文加載和跟蹤的實體實例已經爲「myProperty的」一個的42值,則其在變更跟蹤器狀態是在第三調用「的SaveChanges」期間的不同線。

  1. 基於快照的更改跟蹤 - 其狀態爲「未更改」。
  2. 基於通知的變更跟蹤與代理 - 其狀態是「修改」。

鑑於在基於通知的變更跟蹤下,在調用「SaveChanges」期間不必要的更新語句將被髮送到數據庫我認爲大多數開發人員更喜歡基於快照的變更跟蹤行爲。

這是行爲故意的差異嗎?

當通過代理使用基於通知的更改跟蹤時,是否有辦法實現與基於快照的更改跟蹤相同的行爲?

注意,我相信這是與此相關的功能建議 - http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015363-better-change-tracking-for-poco-proxies

回答

6

此行爲是intentional。原因是與基於舊的EntityObject的實體具有相同的後向行爲兼容性 - 它們以相同的方式運行 - 它們將屬性更改爲與實際修改相同的值。鏈接的文章還顯示,只有在快照更改跟蹤存在性能問題時,新建議纔會使用快照更改跟蹤並選擇更改跟蹤代理。