Procedimiento para resolver conflictos conservando valores de base de datos
Para conciliar las diferencias entre los valores de base de datos esperados y reales antes de intentar reenviar los cambios, puede utilizar OverwriteCurrentValues para conservar los valores que se encuentran en la base de datos. Los valores actuales del modelo de objetos se sobrescriben. Para obtener más información, consulta Simultaneidad optimista: Información general.
Nota
En todos los casos, al recuperar los datos actualizados de la base de datos se actualiza en primer lugar el registro en el cliente. Esta acción garantiza que el siguiente intento de actualización no producirá errores en las mismas comprobaciones de simultaneidad.
Ejemplo
En este escenario, se inicia una excepción ChangeConflictException cuando User1 intenta enviar los cambios, porque User2 ha cambiado en ese período de tiempo las columnas Assistant y Department. En la tabla siguiente se muestra la situación.
State | Manager | Asistente | department |
---|---|---|---|
Estado de la base de datos original cuando la consultan User1 y User2. | Alfreds | Maria | Ventas |
User1 se prepara para enviar los cambios. | Alfred | Marketing | |
User2 ya ha enviado los cambios. | Mary | Servicio |
User1 decide resolver este conflicto haciendo que los valores más nuevos de la base de datos sobrescriban los valores actuales del modelo de objetos.
Cuando User1 resuelve el conflicto utilizando OverwriteCurrentValues, el resultado en la base de datos es el de la tabla siguiente:
State | Manager | Asistente | department |
---|---|---|---|
Nuevo estado tras la resolución del conflicto. | Alfreds (original) |
Mary (de User2) |
Servicio (de User2) |
El código de ejemplo siguiente muestra cómo sobrescribir los valores actuales del modelo de objetos con los valores de la base de datos. (No se produce ninguna inspección o control personalizado de los conflictos entre miembros individuales.)
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