Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework

di Stefano Mostarda, in LINQ, Entity Framework,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi