Практическое руководство. Разрешение конфликтов за счет сохранения значений баз данных
Чтобы согласовать различия между ожидаемыми и фактическими значениями базы данных до повторной отправки изменений, можно воспользоваться OverwriteCurrentValues для сохранения значений, найденных в базе данных. Текущие значения в объектной модели при этом перезаписываются. Дополнительные сведения см. в разделе "Оптимистическое параллелизм". Обзор.
Примечание.
Во всех случаях запись на клиенте сначала обновляется путем извлечения обновленных данных из базы данных. Это действие гарантирует успешное выполнение следующей попытки обновления при тех же проверках параллелизма.
Пример
В данном сценарии, когда Пользователь1 пытается отправить изменения, возникает исключение ChangeConflictException, поскольку Пользователь2 в это время изменил столбцы "Помощник" и "Отдел". Эта ситуация представлена в следующей таблице.
State | Manager | Помощник | Отдел |
---|---|---|---|
Исходное состояние базы данных при отправке запросов Пользователем1 и Пользователем2. | Алексеи | Мария | Продажи |
Пользователь1 готовится отправить изменения. | Алексей | Маркетинг | |
Пользователь2 уже отправил изменения. | Mary | Service |
Пользователь1 решает устранить этот конфликт путем перезаписи текущих значений из объектной модели более новыми значениями базы данных.
При устранении Пользователем1 конфликта с помощью OverwriteCurrentValues результат в базе данных будет соответствовать данным в следующей таблице.
State | Manager | Помощник | Отдел |
---|---|---|---|
Новое состояние после устранения конфликта. | Алексеи (исходное значение) |
Mary (от Пользователя2) |
Service (от Пользователя2) |
В следующем примере кода показано, как перезаписать текущие значения из объектной модели значениями базы данных (проверка или пользовательская обработка конфликтов отдельных членов не выполняется).
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);
}
}
Dim db As New Northwnd("...")
Try
db.SubmitChanges(ConflictMode.ContinueOnConflict)
Catch ex As ChangeConflictException
Console.WriteLine(ex.Message)
For Each occ As ObjectChangeConflict In db.ChangeConflicts
' All database values overwrite current values.
occ.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues)
Next
End Try