Concorrenza ottimistica in ADO.NET Entity Framework
-
10-07-2019 - |
Domanda
Ho trovato un articolo MSDN che descrive come EF gestisce la concorrenza durante il salvataggio delle modifiche:
Per impostazione predefinita [...] Object Services salva l'oggetto modifiche al database senza verifica della concorrenza . Per proprietà che potrebbero verificarsi a alto grado di concorrenza, noi consiglia di essere la proprietà dell'entità definito nel livello concettuale con un attributo di ConcurrencyMode = " fissato "
Ho due domande:
-
Non avendo proprietà nel mio modello in cui
ConcurrencyMode = " fixed "
, è sicuro per me supporre che se mai viene generato unOptimisticConcurrencyException
quando si salva cambia, è perché l'entità non esiste più nell'archivio dati, ovvero è stata eliminata da un altro utente o mi manca qualcosa?Immagino che EF stia eseguendo una dichiarazione
AGGIORNAMENTO
che assomigli a qualcosa del genere, che, a mio modo di vedere, causerà unOptimisticConcurrencyException
solo se la persona con ID = 1 non esiste:UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
-
Quando si utilizza
ConcurrencyMode = " fixed "
, EF controlla la concorrenza anche durante l'eliminazione di entità? In altre parole, EF eseguirà mai una dichiarazioneDELETE
che assomiglia a questa (con più della semplice chiave primaria nellaWHERE
-clause):DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
Soluzione
Buona domanda.
(1) Sì, ma sfortunatamente non è così semplice. Poiché l'EF (3.5) ha un modello di associazione indipendente, anche l'associazione viene trattata in modo indipendente, e anche se non lo hai detto, diventa parte dei controlli di concorrenza durante gli AGGIORNAMENTI e le CANCELLA.
vale a dire. quando aggiorni una persona vedrai spesso aggiornamenti simili a questo:
UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith'
WHERE ID = 1 AND Partner = 2
vale a dire. Il partner è una colonna FK.
Tutto questo cambia in 4.0 se usi le associazioni FK, come prevediamo anche la maggior parte delle persone.
(2) Per DELETE qualsiasi proprietà ConcurrencyMode = 'fixed' viene verificata durante l'eliminazione. L'eccezione è quando si dispone di uno SPROC per l'eliminazione che non accetta i valori di concorrenza.
Spero che questo aiuti
Alex