Como resolver conflitos substituindo valores de banco de dados

Para reconciliar as diferenças entre os valores de banco de dados esperados e reais antes de tentar reenviar as alterações, você pode usar KeepCurrentValues para substituir os valores do banco de dados. 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 substituindo os valores do banco de dados pelos valores atuais do membro do cliente.

Quando User1 resolve o conflito usando KeepCurrentValues, o resultado no banco de dados é como na tabela a seguir:

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

(do Utilizador1)
Márcia

(original)
Marketing

(do Utilizador1)

O código de exemplo a seguir mostra como substituir valores de banco de dados com os valores de membro do cliente atual. (Nenhuma inspeção ou tratamento personalizado de conflitos de membros individuais ocorre.)

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);
    }
}
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

Consulte também