Como resolver conflitos retendo valores de banco de dados

Para reconciliar as diferenças entre os valores esperados e reais do banco de dados antes de tentar reenviar as alterações, você pode usar OverwriteCurrentValues para reter os valores encontrados no banco de dados. Os valores atuais no modelo de objeto são substituídos. Para obter mais informações, consulte Simultaneidade otimista: visão geral.

Nota

Em todos os casos, o registro no cliente é primeiro atualizado recuperando os dados atualizados do banco de dados. Essa ação garante que a próxima tentativa de atualização não falhe nas mesmas verificações de simultaneidade.

Exemplo

Nesse cenário, uma ChangeConflictException exceção é lançada quando User1 tenta enviar alterações, porque User2 alterou entretanto as colunas Assistente e Departamento. A tabela a seguir mostra a situação.

Estado Gestor Assistente Departamento
Estado original do banco de dados quando consultado por User1 e User2. Alfredos Márcia Sales
User1 prepara-se para submeter estas alterações. Alfredo Marketing
O User2 já submeteu estas alterações. Mary Serviço

User1 decide resolver esse conflito fazendo com que os valores de banco de dados mais recentes substituam os valores atuais no modelo de objeto.

Quando User1 resolve o conflito usando OverwriteCurrentValues, o resultado no banco de dados é o seguinte na tabela:

Estado Gestor Assistente Departamento
Novo Estado após resolução de conflitos. Alfredos

(original)
Mary

(do Utilizador2)
Serviço

(do Utilizador2)

O código de exemplo a seguir mostra como substituir valores atuais no modelo de objeto com os valores de banco de dados. (Nenhuma inspeção ou tratamento personalizado de conflitos de membros individuais ocorre.)

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

Consulte também