2009-06-19 55 views
0

我正在使用LINQ to SQL,並且有一個問題增加了視圖計數器交叉連接。Linq中的ChangeConflictException到Sql非併發更新

的我使用代碼蠅頭位是:

t = this.AppManager.ForumManager.GetThread(id); 
t.Views = t.Views + 1; 
this.AppManager.DB.SubmitChanges(); 

現在在我的測試中,我運行這個多次,不同時。執行此測試的對象總共有4個副本。

也就是說,沒有鎖定問題,或類似的東西,但有4個數據上下文。

現在,我希望這樣工作:取一行,修改一個字段,更新行。但是,這是拋出一個ChangeConflictException。

如果沒有這些副本同時運行,爲什麼更改會發生衝突?

有沒有辦法忽略某個表上的變更衝突?

編輯:找到了答案:

您可以設置「UpdateCheck的=從不」上表中的所有列創建更新的後入勝的風格。這是應用程序在將它移植到LINQ之前所使用的,因此我現在將使用它。

EDIT2:雖然我修復上面確實防止異常被拋出,它並沒有解決根本問題:

因爲我有一個以上的數據背景下,最終被一個以上的緩存每個對象的副本。我應該在每次加載頁面時重新創建數據上下文嗎?

我寧願指示數據上下文來忘記一切。這可能嗎?

回答

2

我相信DataContext被縮進爲相對輕量級和短暫的。國際海事組織,你不應該緩存用DataContext加載的數據超過必要的時間。當它短暫時,它仍然相對較小,因爲(據我瞭解),DataContext的內存使用率主要與跟蹤由它管理的對象(由其檢索)所做的​​更改有關。

在我工作的應用程序中,我們創建了上下文,在UI上顯示數據,等待用戶更新,然後更新數據。但是,這主要是因爲我們希望更新基於用戶正在查看的內容(否則我們可以在用戶點擊更新時檢索數據並立即更新)。如果您的更新相對獨立,我認爲在更新之前立即檢索該行是明智的。

您還可以使用System.Data.Linq.DataContext.Refresh()將已檢索的數據與數據庫中的數據重新同步以幫助解決此問題。

爲了迴應你最近關於使上下文忘記一切的評論,我不認爲有辦法做到這一點,但我懷疑這是因爲所有上下文都是跟蹤的更改(和連接),而且你創建一個新的上下文(記得處理舊的上下文)就好了,因爲你真的想丟掉上下文所有的東西。