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
Fare automaticamente il merge di una pull request con un workflow di GitHub
Sfruttare il portale Azure per creare script di automazione
Condividere i workflow tra più repository in GitHub
Scoprire le ottimizzazioni di Entity Framework Core in fase di scrittura di un solo record
Organizzare i moduli sfruttando CommonJS
Taggare la output cache in base al routing in ASP.NET Core
Leggere e scrivere su cookie tramite Blazor
Utilizzo di Map e Object in Javascript
Ottimizzare il codice JavaScript utilizzando WeakMap e WeakSet
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Controllare se un branch esiste nel remote con un workflow di GitHub
Gestire condizioni complesse in JavaScript