Compartilhar via


Como: resolver conflitos substituindo valores de banco de dados

Para reconciliar diferenças entre valores esperados e reais de base de dados antes que você submeter tente novamente suas alterações, você pode usar KeepCurrentValues para substituir valores de base de dados. Para obter mais informações, confira Simultaneidade otimista: visão geral.

Observação

Em todos os casos, o registro no cliente é atualizado primeiro recuperando os dados atualizados de base de dados. Esta ação certifique-se de que a seguir tentativa de atualização não falhará nas mesmas verificação de simultaneidade.

Exemplo

Nesse cenário, uma exceção é lançada de ChangeConflictException quando tenta User1 para enviar alterações, porque Usuário2 tiver alterado entretanto as colunas do assistente e departamento. A tabela a seguir mostra a situação.

Estado Gerente Assistente department
Estado original de base de dados quando consultado por User1 e por Usuário2. Alfreds Maria Sales
User1 prepara-se para enviar essas alterações. Alfred Marketing
Usuário2 já tiver enviado essas alterações. Mary Serviço

User1 decidir resolver esse conflito substituindo valores de base de dados com os valores atuais do membro de cliente.

Quando User1 resolver o conflito usando KeepCurrentValues, o resultado na base de dados é como na tabela a seguir:

Estado Gerente Assistente department
Novo estado após a resolução do conflito. Alfred

(de User1)
Maria

(original)
Marketing

(de User1)

O código exemplo a seguir mostra como substituir valores de base de dados com os valores atuais do membro de cliente. (Nenhuma inspeção ou manipulação personalizada de conflitos de membro individual ocorrem.)

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

Confira também