Partilhar via


Como resolver conflitos mesclando com 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 KeepChanges para mesclar valores de banco de dados com os valores de membro do cliente atual. 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 mesclando valores de banco de dados com os valores de membro do cliente atual. O resultado será que os valores do banco de dados serão substituídos somente quando o conjunto de alterações atual também tiver modificado esse valor.

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

(do Utilizador2)
Marketing

(do Utilizador1)

O exemplo a seguir mostra como mesclar valores de banco de dados com os valores de membro do cliente atual (a menos que o cliente também tenha alterado esse valor). Nenhuma inspeção ou tratamento personalizado de conflitos de membros individuais ocorre.

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)

Consulte também