Compartir a través de


Procedimiento para resolver conflictos mediante combinaciones con 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 KeepChanges para combinar los valores de base de datos con los valores de miembro de cliente actuales. Para obtener más información, consulte 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 combinando los valores de la base de datos con los valores de miembro de cliente actuales. El resultado será que los valores de la base de datos se sobrescribirán cuando el conjunto de cambios actual haya modificado también ese valor.

Cuando User1 resuelve el conflicto utilizando KeepChanges, el resultado en la base de datos es como en la tabla siguiente:

State Manager Asistente department
Nuevo estado tras la resolución del conflicto. Alfred

(de User1)
Mary

(de User2)
Marketing

(de User1)

En el ejemplo siguiente se muestra cómo combinar los valores de la base de datos con los valores de miembro de cliente actuales (a menos que el cliente también haya cambiado ese valor). No se produce ninguna inspección o control personalizado de los conflictos entre miembros individuales.

try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    // Automerge database values for members that client
    // has not modified.
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
}

// Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

Catch ex As ChangeConflictException
    Console.WriteLine(ex.Message)

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' Automerge database values into current for members
        ' that client has not modified.
        occ.Resolve(Data.Linq.RefreshMode.KeepChanges)
    Next

End Try

' Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict)

Consulte también