Quando dobbiamo aggiornare un record sul database utilizzando Entity Framework, la tecnica più semplice è quella di recuperare l'oggetto, modificarne le proprietà e invocare la persistenza. Se dobbiamo eseguire l'aggiornamento di molti record, questa tecnica può risultare molto pesante in quanto Entity Framework lancia una update per ogni record.
Per fare un esempio concreto, supponiamo di voler aggiornare tutti i prodotti in catalogo aumentando il prezzo del 1%. Utilizzando la tecnica appena descritta, dovremmo fare una query che torna tutti i prodotti (occupando molta memoria), modificare il prezzo di ogni prodotto e poi invocare la persistenza che lancerà una update per ogni prodotto.
In questi casi, la cosa migliore è utilizzare direttamente un comando SQL che aggiorna massivamente tutti i record sul database senza doverli nemmeno caricare in memoria. Questo comando SQL può essere lanciato tramite il metodo ExecuteCommand esposto dalla proprietà Database del contesto. Sebbene il codice sia molto semplice, ha lo svantaggio di non farci lavorare ad oggetti, ma di farci lavorare direttamente con il database. A partire da EF 7, possiamo utilizzare il metodo BulkUpdate per esprimere tramite lambda sia i campi da modificare sia le condizioni che devono rispettare i record che devono essere modificati così come mostrato nel seguente codice.
context.Products .Where(p => p.Category = "shoes") .ExecuteUpdate(p => p.SetProperty(x => x.Price, x => x.Price + (x.Price * (1 / 100))));
Il risultato di questo codice è un comando SQL che esegue una update massiva filtrando per categoria ed aggiornando il prezzo ottimizzando così utto il processo di aggiornamento e senza farci usare direttamente il codice SQL.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
.NET Conference Italia 2023
Effettuare il download di un file via FTP con la libreria FluentFTP di .NET
Generare file per il download da Blazor WebAssembly
Elencare le container images installate in un cluster di Kubernetes
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Verificare la provenienza di un commit tramite le GitHub Actions
Eseguire attività pianificate con Azure Container Jobs
C# 12: Cosa c'è di nuovo e interessante
Utilizzare Tailwind CSS all'interno di React: installazione
Accesso sicuro ai secrets attraverso i file in Azure Container Apps
Evitare la script injection nelle GitHub Actions
Eseguire query manipolando liste di tipi semplici con Entity Framework Core