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