0%

【LINQ TO SQL】解決SubmitChanges時與資料庫衝突的問題

  • 一樣參考保哥的解決 LINQ to SQL 資料庫更新衝突的情形與公司前輩的Source Code

  • 發生原因:有可能我們在跟DB取得某個欄位時得到A這個值,但當我們改動這個值並嘗試更新回DB時,可能DB早就被其他使用者改成B了。DBContext SubmitChanges會去比對這個欄位最初值是否與DB目前的值一致避免Dirty Data的問題,但當上述情況發生時則會擲出Exception。各種處理方式如下:```csharp
    try
    {
    _dbContext.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
    }
    catch (System.Data.Linq.ChangeConflictException ex)
    {
    foreach (System.Data.Linq.ObjectChangeConflict occ in _dbContext.ChangeConflicts)
    {

    // 採用資料庫的查詢出來的值,目前物件的值將會被資料庫最新查到的複寫
    //occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
    
        // 採用目前物件中的值,並更新資料庫中的版本
    //occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
    
        // 僅更新此物件中變更的欄位,僅將變更的欄位寫入資料庫(或稱為合併更新)
    occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
    

    }
    // 注意:解決完衝突之後要記得重新再 SubmitChanges() 一次,否則一樣不會更新資料庫
    _dbContext.SubmitChanges();
    }