Como resolver conflitos retendo valores de banco de dados
Para reconciliar as diferenças entre os valores esperados e reais do banco de dados antes de tentar reenviar as alterações, você pode usar OverwriteCurrentValues para reter os valores encontrados no banco de dados. Os valores atuais no modelo de objeto são substituídos. 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 fazendo com que os valores de banco de dados mais recentes substituam os valores atuais no modelo de objeto.
Quando User1 resolve o conflito usando OverwriteCurrentValues, o resultado no banco de dados é o seguinte na tabela:
Estado | Gestor | Assistente | Departamento |
---|---|---|---|
Novo Estado após resolução de conflitos. | Alfredos (original) |
Mary (do Utilizador2) |
Serviço (do Utilizador2) |
O código de exemplo a seguir mostra como substituir valores atuais no modelo de objeto com os valores de banco de dados. (Nenhuma inspeção ou tratamento personalizado de conflitos de membros individuais ocorre.)
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