Procedura: risolvere i conflitti mantenendo valori di database
Per risolvere le differenze tra i valori del database previsti ed effettivi prima del tentativo di inviare di nuovo le modifiche, è possibile usare OverwriteCurrentValues per conservare i valori trovati nel database. I valori correnti nel modello a oggetti vengono quindi sovrascritti. Per altre informazioni, vedere Concorrenza ottimistica: Panoramica.
Nota
In tutti i casi, viene innanzitutto aggiornato il record sul client recuperando i dati aggiornati dal database. Questa azione assicura che il successivo tentativo di aggiornamento non avrà esito negativo durante gli stessi controlli di concorrenza.
Esempio
In questo scenario viene generata un'eccezione ChangeConflictException quando User1 tenta di inviare le modifiche, in quanto nel frattempo User2 ha modificato le colonne Assistant e Department. Nella tabella seguente è illustrata questa situazione.
Provincia | Manager | Assistente | Department |
---|---|---|---|
Stato del database originale quando viene eseguita una query da User1 e User2. | Alfreds | Maria | Vendite |
User1 si prepara a inviare queste modifiche. | Alfred | Marketing | |
User2 ha già inviato queste modifiche. | Mary | Servizio |
User1 decide di risolvere questo conflitto sovrascrivendo i valori correnti nel modello a oggetti con i valori del database più recenti.
Quando User1 risolve il conflitto usando OverwriteCurrentValues, il risultato nel database sarà come nella tabella seguente:
Provincia | Manager | Assistente | Department |
---|---|---|---|
Nuovo stato dopo la risoluzione dei conflitti. | Alfreds (originale) |
Mary (da User2) |
Servizio (da User2) |
Nel codice di esempio seguente viene illustrato come sovrascrivere i valori correnti nel modello a oggetti con i valori del database. Non si verificano conflitti di ispezione o gestione personalizzata dei singoli membri.
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