Cómo: Resolver conflictos de simultaneidad mediante la invalidación de valores de base de datos (LINQ to SQL)
Actualización: November 2007
Para resolver las diferencias existentes entre los valores de base de datos esperados y reales antes de intentar reenviar los cambios, puede utilizar KeepCurrentValues para sobrescribir los valores de base de datos. Para obtener más información, vea Información general sobre la simultaneidad optimista (LINQ to SQL).
![]() |
---|
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.
|
Administrador |
Assistant |
Department |
---|---|---|---|
Estado de la base de datos original cuando la consultan User1 y User2. |
Alfreds |
Maria |
Sales |
User1 se prepara para enviar los cambios. |
Alfred |
|
Marketing |
User2 ya ha enviado los cambios. |
|
Mary |
Servicio |
User1 decide resolver este conflicto sobrescribiendo los valores de la base de datos con los valores de miembro de cliente actuales.
Cuando User1 resuelve el conflicto utilizando KeepCurrentValues, el resultado en la base de datos es como en la tabla siguiente:
|
Administrador |
Assistant |
Department |
---|---|---|---|
Nuevo estado tras la resolución del conflicto. |
Alfred (de User1) |
Maria (original) |
Marketing (de User1) |
En el siguiente ejemplo de código se muestra cómo sobrescribir los valores de base de datos con los valores de miembro de cliente actuales. (No se produce ninguna inspección o control personalizado de los conflictos entre miembros individuales.)
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);
}
}