2010-07-21 85 views
4

這是併發性相關的。所以SubmitChanges()失敗,並引發ChangeConflictException。對於db.ChangeConflicts中的每個ObjectChangeConflict,其解析設置爲RefreshMode.OverwriteCurrentValues?這是什麼意思?有人可以向我解釋此MSDN代碼的英文嗎?

http://msdn.microsoft.com/en-us/library/bb399354.aspx

Northwnd db = new Northwnd("..."); 
try 
{ 
    db.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 

catch (ChangeConflictException e) 
{ 
    Console.WriteLine(e.Message); 
    foreach (ObjectChangeConflict occ in db.ChangeConflicts) 
    { 
     // All database values overwrite current values. 
     occ.Resolve(RefreshMode.OverwriteCurrentValues); 
    } 
} 

回答

9

我加入到代碼中的一些意見,看看是否有幫助:

Northwnd db = new Northwnd("..."); 
try 
{ 
    // here we attempt to submit changes for the database 
    // The ContinueOnConflict specifies that all updates to the 
    // database should be tried, and that concurrency conflicts 
    // should be accumulated and returned at the end of the process. 
    db.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 

catch (ChangeConflictException e) 
{ 
    // we got a change conflict, so we need to process it 
    Console.WriteLine(e.Message); 

    // There may be many change conflicts (if multiple DB tables were 
    // affected, for example), so we need to loop over each 
    // conflict and resolve it. 
    foreach (ObjectChangeConflict occ in db.ChangeConflicts) 
    { 
     // To resolve each conflict, we call 
     // ObjectChangeConflict.Resolve, and we pass in OverWriteCurrentValues 
     // so that the current values will be overwritten with the values 
     // from the database 
     occ.Resolve(RefreshMode.OverwriteCurrentValues); 
    } 
} 
0

我認爲,這意味着,如果它檢測到衝突,見this計算科學根據,那麼它進入捕撈。在那裏,它經歷了每個衝突(foreach循環),並將值重置爲它們在變化嘗試發生之前的樣子。

0

顯然,你對我所做的對象的任何變化都被拋出,因爲別人偷了你的遊行和更新的數據庫,而你忙。在optimistic concurrency中,刪除更改是唯一可能的自動解決方案。但是,如果用戶花費任何時間輸入丟棄的數據,用戶可能不會太高興。

0

的衝突propabely由以下事實引起你的DataContext對象(物體在.NET存儲並保存變更等代碼)有其他值,那麼在你的分貝。

比方說,你從數據庫加載一個人對象。其中一個字段是名字,名字是S oo。現在,您在datacontext中有一條記錄副本。你改變了一些東西,並希望將更改寫入數據庫,但是當(LINQ?other orm)想要將更改寫入數據庫時​​,它會注意到數據庫中的名字已被更改。所以有人/某事改變了你的記錄,你有一種「僵局」(正確的術語?),那麼你必須定義什麼是更重要的,你的改變,或某些/別人所做的改變。

到了點! - > Refreshmode.overwirteCurrentValues只需刷新數據環境中的對象,就可以從數據庫中重新載入對象,以便使用更新後的對象。

我希望這是一個有點清楚:)

grtz

1

首先,你必須明白,LinqToSql跟蹤兩種狀態的每個數據庫行。原始狀態和當前狀態。原始狀態是datacontext認爲是在數據庫中。當前狀態有你的內存中的修改。

其次,LinqToSql使用樂觀併發來執行更新。當調用SubmitChanges時,datacontext將原始狀態(作爲過濾器)和當前狀態一起發送到數據庫中。如果沒有記錄被修改(因爲數據庫的記錄不再與原始狀態匹配),則引發ChangeConflictException。

第三,要解決更改衝突,你必須覆蓋原來的狀態,這樣的樂觀併發過濾器可以找到記錄。然後,您必須決定如何處理當前狀態......您可以放棄您的修改(這是發佈的代碼的作用),這將不會對記錄進行更改,但是您可以繼續使用當前數據庫值在您的應用程序。

相關問題