2012-05-15 49 views
2

所以這是一個很簡單的問題,我還沒找到答案。 因此,情況如下:有多個用戶的RefreshMode.ClientWins會發生什麼?

  • User1的初始化一個ObjectContext的
  • 用戶2初始化的相同類型的另一個的ObjectContext
  • User1的改變實體A
  • 用戶2改變實體B
  • 用戶2保存改變
  • User1使用RefreshMode.ClientWins進行刷新並繼續保存更改

那麼實體B會發生什麼? User1沒有改變它,但它不同於數據庫中的版本。我的直覺會說,因爲User1沒有對實體B做任何改變,所以它會停留在User2離開它的狀態。但唉,我不確定,因此我在問一個更好的人。

回答

2

您的期望是正確的 - 實體B將不會發生任何事情,因爲數據庫中沒有任何更改,所以刷新什麼都不做。

對象上下文內部跟蹤每個被跟蹤實體的兩組值 - 原始值和當前值。原始值是從數據庫加載的值,當前值是加載實體後由應用程序修改的實際值。

當您通過ClientWins模式調用Refresh模式時,上下文將爲實體查詢數據庫,更新實體的跟蹤記錄中的所有原始值並更新應用程序尚未更改的當前值 - 已更改的值沒有更新(即客戶端刷新)。

執行SaveChanges EF將通過比較原始值和當前值來檢測更改,並僅爲更改的列創建更新命令。 ClientWins刷新模式用於具有樂觀併發的方案,以強制用新值覆蓋數據庫更改。

3

RefreshMode.ClientWins隻影響是否保留本地更改。如果沒有本地更改,則RefreshMode.ClientWinsRefreshMode.StoreWins之間沒有區別。

我看到documentation稍微混亂:

的StoreWins模式意味着該對象應當被更新以匹配數據源的值。 ClientWins值意味着只有對象上下文中的更改纔會被保留,即使數據源中還有其他更改。

對象上下文中的非更改不會與RefreshMode.ClientWins一起保留,但文檔沒有明確說明。