Compartilhar via


Como: resolver conflitos mesclando com 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 KeepChanges para mesclar valores de base de dados com os valores atuais do membro de cliente. Para obter mais informações, consulte 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 de mesclagem valores base de dados com os valores atuais do membro de cliente. O resultado é que os valores de base de dados são substituídos somente quando o conjunto de alterações atual também alterou o valor.

Quando User1 resolver o conflito usando KeepChanges, 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)
Mary

(de Usuário2)
Marketing

(de User1)

O exemplo a seguir mostra como mesclar valores de base de dados com os valores atuais do membro de cliente (a menos que o cliente também alterou o valor). 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);
    // 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)

Confira também