Compartilhar via


Como: resolver conflitos mantendo 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 OverwriteCurrentValues para manter os valores localizados na base de dados. Os valores atuais no modelo de objeto são substituídos em seguida. 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 com os valores mais recentes de base de dados substitui os valores atuais no modelo de objeto.

Quando User1 resolver o conflito usando OverwriteCurrentValues, o resultado na base de dados é o seguinte na tabela:

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

(original)
Mary

(de Usuário2)
Serviço

(de Usuário2)

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

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

Confira também