Procedura: risolvere i conflitti di concorrenza conservando i valori del database (LINQ to SQL)
Per risolvere le differenze tra i valori del database previsti ed effettivi prima del tentativo di inviare di nuovo le modifiche, è possibile utilizzare OverwriteCurrentValues per conservare i valori trovati nel database. I valori correnti nel modello a oggetti vengono quindi sovrascritti. Per ulteriori informazioni, vedere Cenni preliminari sulla concorrenza ottimistica (LINQ to SQL).
![]() |
---|
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.
|
Manager |
Assistant |
Department |
---|---|---|---|
Stato del database originale quando viene eseguita una query da User1 e User2. |
Alfreds |
Maria |
Sales |
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 utilizzando OverwriteCurrentValues, il risultato nel database sarà come nella tabella seguente:
|
Manager |
Assistant |
Department |
---|---|---|---|
Nuovo stato dopo la risoluzione dei conflitti. |
Alfreds (originale) |
Mary (da User2) |
Service (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.
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
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);
}
}