更新:November 2007
若要先协调预期数据库值与实际数据库值之间的差异,再尝试重新提交更改,则可以使用 KeepCurrentValues 覆盖数据库值。有关更多信息,请参见 开放式并发概述 (LINQ to SQL)。
| .gif) 说明: | 
|---|
| 在所有情况下,都会先通过从数据库中检索更新后的数据来刷新客户端上的记录。此操作确保了下一次更新尝试将通过相同的并发检查。 | 
示例
在本方案中,当 User1 尝试提交更改时将引发 ChangeConflictException 异常,原因是 User2 同时已更改了 Assistant 和 Department 列。下表说明了这种情况。
| 
 | Manager | Assistant | Department | 
|---|---|---|---|
| 原始数据库在被 User1 和 User2 查询时的状态。 | Alfreds | Maria | Sales | 
| User1 准备提交这些更改。 | Alfred | 
 | Marketing | 
| User2 已经提交了这些更改。 | 
 | Mary | Service | 
User1 决定通过用当前客户端成员值覆盖数据库值来解决此冲突。
User1 通过使用 KeepCurrentValues 解决了此冲突后,数据库中的结果将如下表中所示:
| 
 | Manager | Assistant | Department | 
|---|---|---|---|
| 解决冲突后的新状态。 | Alfred (来自 User1) | Maria (原始) | Marketing (来自 User1) | 
下面的示例代码演示了如何用当前客户端成员值覆盖数据库值。(未对各个成员冲突进行检查或自定义处理。)
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
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);
    }
}