Procedura: risolvere i conflitti di concorrenza sovrascrivendo 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 KeepCurrentValues per sovrascrivere i valori del database. Per ulteriori informazioni, vedere Cenni preliminari sulla concorrenza ottimistica (LINQ to SQL).
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.
|
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 del database con i valori del membro client corrente.
Quando User1 risolve il conflitto utilizzando KeepCurrentValues, il risultato nel database sarà come nella tabella seguente:
|
Manager |
Assistant |
Department |
---|---|---|---|
Nuovo stato dopo la risoluzione dei conflitti. |
Alfred (da User1) |
Maria (originale) |
Marketing (da User1) |
Nel codice di esempio seguente viene illustrato come sovrascrivere i valori del database con i valori del membro client corrente. Non si verificano conflitti di ispezione o gestione personalizzata dei singoli membri.
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
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);
}
}