Como: resolver conflitos substituindo 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 KeepCurrentValues para substituir valores de base de dados. 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 substituindo valores de base de dados com os valores atuais do membro de cliente.
Quando User1 resolver o conflito usando KeepCurrentValues, 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) |
Maria (original) |
Marketing (de User1) |
O código exemplo a seguir mostra como substituir valores de base de dados com os valores atuais do membro de cliente. (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);
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