Tramite ADO.NET Entity Framework è possibile gestire casi di concorrenza in scrittura direttamente nell'editor del model, impostando l'attributo ConcurrencyMode al valore Fixed per ogni proprietà che si vuole includere nel lock ottimistico. Tale operazione può essere effettuata sia nel designer di Visual Studio, sia agendo direttamente sul codice XML del Conceptual Schema Definition (CSDL):
<Property Name="RagioneSociale" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" ConcurrencyMode="Fixed" />
L'effetto è che, in presenza di Update o Delete, l'engine introdurce ulteriori condizioni di WHERE per verificare che i valori delle proprietà specificate non siano stati modificati da altri utenti, producendo una query simile alla seguente:
update [dbo].[Clienti] set [RagioneSociale] = 'ValoreModificato' where (([Id] = 1) and ([RagioneSociale] = 'ValoreOriginale'))
In presenza di un errore di concorrenza, l'invocazione del metodo SaveChanges dell'ObjectContext fallisce e viene sollevata una OptimisticConcurrencyException.
Abilitare il lock ottimistico per ogni singola proprietà di una entity è però scomodo, poco manutenibile e soggetto ad errori; una best-practice, nel caso si utilizzi Sql Server, è quella di aggiungere alla tabella una colonna di tipo TimeStamp, che viene automaticamente modificata dal server ad ogni operazione di scrittura, e di impostare solo su essa il controllo della concorrenza.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Change tracking e composition in Entity Framework
Loggare le query più lente con Entity Framework
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Eseguire query in contemporanea con EF
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
I più letti di oggi
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- .NET Conference Italia 2025 - Milano