Como: resolver conflitos mantendo 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 OverwriteCurrentValues para manter os valores localizados na base de dados. Os valores atuais no modelo de objeto são substituídos em seguida. 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 com os valores mais recentes de base de dados substitui os valores atuais no modelo de objeto.
Quando User1 resolver o conflito usando OverwriteCurrentValues, o resultado na base de dados é o seguinte na tabela:
Estado | Gerente | Assistente | department |
---|---|---|---|
Novo estado após a resolução do conflito. | Alfreds (original) |
Mary (de Usuário2) |
Serviço (de Usuário2) |
O código exemplo a seguir mostra como substituir valores atuais no modelo de objeto com os valores de base de dados. (Nenhuma inspeção ou manipulação personalizada de conflitos de membro individual ocorrem.)
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