Quando dobbiamo creare una tabella e optiamo per l'uso di chiavi surrogate, la scelta del tipo del campo chiave è tra un valore autoincrementale generato dalla tabella nel database (campo identity) o un valore conosciuto già prima della insert (Guid o sequence). Uno dei motivi per utilizzare una chiave di cui si conosce il valore prima della INSERT è la necessità di utilizzare l'id anche in altre tabelle come quelle di auditing o altro (ad esempio come nel caso in cui un dettaglio dell'ordine ha bisogno dell'id dell'ordine).
Sebbene questa funzionalità sia raggiungibile anche con un id generato dal database, richiede diversi passaggi. Prendendo come esempio l'nserimento di un ordine e dei suoi dettaglio, dobbiamo inserire l'ordine sul database, recuperare l'id generato, usarlo nell'inserimento dei dettagli. EF permette di ottimizzare il processo con una semplice tecnica: invece di usare un campo identity, l'id viene generato da una sequence. EF legge dalla sequence un set di valori (10 di default) e li usa per ogni insert. Per fare un esempio, se dobbiamo inserire tre ordini, EF Core legge 10 valori dalla sequence, ne usa tre per le insert e tiene gli altri sette in cache. Se poi dobbiamo inserire altri cinque ordini, vengono usati cinque dei sette valori rimasti dalla precedente operazione senza la necessità di accedere al database.
Grazie a questa tecnica, il client conosce gli id prima delle insert e genera codice SQL che effettua le insert di ordini e dettagli in un solo comando ottimizzando il colloquio con il database. Per abilitare questa funzionalità, si deve chiamare il metodo UseHiLo sulla proprietà che rappresenta l'id in fase di mapping.
modelBuilder.Entity<Person>().Property(e => e.Id).UseHiLo();
Se usiamo le migrazioni per generare il database, EF si occupa di generare la sequence per noi, altrimenti dovremo generarla con uno script SQL. Nel prossimo script vedremo come customizzare alcuni parametri come il nome della sequence o il numero di valori che EF core estrae da essa.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Creare un webhook in Azure DevOps
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Utilizzare QuickGrid di Blazor con Entity Framework
Eseguire attività pianificate con Azure Container Jobs
Recuperare l'ultima versione di una release di GitHub
Hosting di componenti WebAssembly in un'applicazione Blazor static
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Criptare la comunicazione con mTLS in Azure Container Apps
I più letti di oggi
- Centrare elementi in HTML tramite CSS
- Proteggere le risorse Azure con private link e private endpoints
- Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
- Referenziare un @layer più alto in CSS
- Gestire i dati con Azure Cosmos DB Data Explorer
- Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API