作法:藉由覆寫資料庫值來解決衝突
若要先協調預期和實際資料庫值之間的差異再重新送出變更,可以使用 KeepCurrentValues 覆寫資料庫值。 如需詳細資訊,請參閱開放式同步存取:概觀。
注意
在所有情況下,擷取資料庫中更新過的資料會先重新整理用戶端上的資料錄。 這個動作可確保下一次嘗試更新時,不會在相同的並行存取檢查時失敗。
範例
在這個案例下,當 User1 嘗試送出變更時,因為 User2 同時變更了 Assistant 和 Department 資料行,所以會擲回 ChangeConflictException 例外狀況。 下表顯示這個情況。
州/省 | 管理員 | 小幫手 | 部門 |
---|---|---|---|
User1 和 User2 查詢時的原始資料庫狀態。 | Alfreds | Maria | Sales |
User1 準備送出這些變更。 | Alfred | 行銷 | |
User2 已送出這些變更。 | Mary | 服務 |
User1 決定以目前的用戶端成員值覆寫資料庫值,來解決這個衝突。
User1 使用 KeepCurrentValues 解決衝突時,資料庫中的結果會如同下表:
州/省 | 管理員 | 小幫手 | 部門 |
---|---|---|---|
解決衝突後的新狀態。 | Alfred (來自 User1) |
Maria (原始) |
行銷 (來自 User1) |
下列範例程式碼顯示如何以目前的用戶端成員值來覆寫資料庫值 (但不會對個別成員衝突進行任何檢查或自訂處理)。
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
//No database values are merged into current.
occ.Resolve(RefreshMode.KeepCurrentValues);
}
}
Try
db.SubmitChanges(ConflictMode.ContinueOnConflict)
Catch ex As ChangeConflictException
Console.WriteLine(ex.Message)
For Each occ As ObjectChangeConflict In db.ChangeConflicts
' No database values are merged into current.
occ.Resolve(Data.Linq.RefreshMode.KeepCurrentValues)
Next
End Try