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
Limitare le richieste lato server con l'interactive routing di Blazor 8
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Supportare la sessione affinity di Azure App Service con Application Gateway
Generare un hash con SHA-3 in .NET
Utilizzare Azure AI Studio per testare i modelli AI
Utilizzare una qualunque lista per i parametri di tipo params in C#
Proteggere le risorse Azure con private link e private endpoints
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Selettore CSS :has() e i suoi casi d'uso avanzati
Utilizzare il trigger SQL con le Azure Function
Filtering sulle colonne in una QuickGrid di Blazor
Collegare applicazioni server e client con .NET Aspire
I più letti di oggi
- Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
- Utilizzare StartsWith ed EndsWith con Span
- Utilizzare l nesting nativo dei CSS
- Microsoft lancia il nuovo tool gratuito 'ASP.NET Web Matrix Project'
- Managed deployment strategy in Azure DevOps
- Forzare l'apertura di un file fuori dal browser
- Configurare e gestire sidecar container in Azure App Service