一樣參考保哥的解決 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();
}