#75 - Gestire gli errori di concorrenza in Entity Framework
di Marco De Sanctis, in LINQ, Entity Framework, 22 ottobre 2008
Nello script #73 abbiamo visto che, abilitando il lock ottimistico, ADO.NET Entity Framework è in grado di riconoscere violazioni di concorrenza e di notificarli sollevando una OptimisticConcurrencyException.
Il modo più semplice per gestire situazioni simili è quello di effettuare una rilettura dei dati e di procedere, magari dopo aver chiesto conferma all'utente, ad una nuova scrittura:
private void saveCustomer(SampleContext sampleContext, Cliente cliente) { try { sampleContext.SaveChanges(); } catch (OptimisticConcurrencyException ex) { if (askUser("I dati sono stati modificati da un altro utente, " + "si vuole comunque sovrascriverli?")) { sampleContext.Refresh(RefreshMode.ClientWins, cliente); saveCustomer(sampleContext, cliente); } else { sampleContext.Refresh(RefreshMode.StoreWins, cliente); } } }
Il metodo ObjectContext.Refresh accetta un parametro di tipo RefreshMode che indica la strategia da utilizzare nel caso in cui i valori attuali della entity differiscano da quelli presenti sul database; in particolare
- StoreWins effettua un refresh completo della entity, che coinvolge sia i dati originali che quelli attuali; le eventuali modifiche effettuate dall'utente vengono pertanto perse.
- ClientWins effettua un refresh dei soli dati originali, lasciando inalterate le modifiche; in questo modo una successiva scrittura avrà successo, ma verranno perse le modifiche operate da altri utenti e già presenti su database.
Un'ultima nota riguarda OptimisticConcurrencyException ed in particolare la sua proprietà StateEntries: tramite essa è possibile risalire ad informazioni sulla entity coinvolta nella violazione di concorrenza (quali identificativo, nomi e valori delle proprietà modificate, ecc.), utilizzabili nel caso si voglia implementare una gestione custom più sofisticata, che ad esempio consenta all'utente di effettuare un merge tra le due diverse versioni dell'oggetto.
Approfondimenti
-
#138 - Estrarre un subset di oggetti da una lista non generica con LINQ
-
#112 - Raggruppare i siti in IIS 7.0 in base all'ApplicationPool con LINQ to Objects
-
Oltre il database, da Bing a Twitter: i provider per LINQ per ogni esigenza
-
#114 - Caricare immediatamente un grafo di oggetti complesso con Entity Framework
-
#124 - Ottimizzare le Where con l'operatore Like in Entity Framework
-
.NET Framework 4.0 beta 1: WPF 4.0
-
Tool per testare il mapping con Entity Framework
-
#160 - Forzare il caricamento dei metadati con Entity Framework
-
#109 - Effettuare il Binding in WPF di una query Entity Framework
-
#146 - Simulare la clausola SQL Exists con il metodo Any in LINQ to Entities
-
#144 - Utilizzare il metodo ForEach di LINQ per eseguire un'azione su ogni oggetto di una lista
-
Real Code Day 4.0: Agenda (quasi) completata!

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.