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:

  1. Non avendo proprietà nel mio modello in cui ConcurrencyMode = " fixed " , è sicuro per me supporre che se mai viene generato un OptimisticConcurrencyException 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à un OptimisticConcurrencyException solo se la persona con ID = 1 non esiste:

    UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
    
  2. Quando si utilizza ConcurrencyMode = " fixed " , EF controlla la concorrenza anche durante l'eliminazione di entità? In altre parole, EF eseguirà mai una dichiarazione DELETE che assomiglia a questa (con più della semplice chiave primaria nella WHERE -clause):

    DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
    
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top