Per default, quando eseguiamo una query Entity Framework Core salva le entity recuperate all'interno del contesto. Se una entity si trova già nel contesto, questa viene restituita e i dati provenienti dal database vengono scartati. Entity Framework Core mette a disposizione il metodo AsNoTracking che disabilita il salvataggio dell'entity all'interno del contesto e non cerifica se queste esistano già. Il risultato è che una query che utilizza questo metodo restituisce sempre entity nuove con i dati presenti nel database.
Con la versione 5, è stato introdotto il metodo AsNoTrackingWithIdentityResolution che permette di combinare le funzionalità. Grazie a questo metodo, le entitiy recuperate non vengono salvate nel contesto e non viene fatta la verifica se l'entity esiste già, ma se la query restituisce più volte la stessa entity (un caso molto comune quando si usa Include), viene creata una sola istanza di questa entity.
var people = ctx.People .AsNoTrackingWithIdentityResolution() .Include(p => p.Children) .Where(c => c.CittaNascita == "Roma") .ToList();
In questa query, si recuperano tutte le persone nate a Roma e si includono i figli. Se il figlio di una persona nata a Roma è nato a sua volta a Roma, la sua entity apparirà due volte: una volta nella lista people e una volta nella lista Children dell'entity che rappresenta il padre. Con AsNoTracking verrebbero create due istanze per il figlio, mentre con AsNoTrackingWithIdentityResolution verrebbe creata una sola istanza.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire le GitHub Actions offline
Eseguire una query su SQL Azure tramite un workflow di GitHub
Gestire liste di tipi semplici con Entity Framework Core
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Referenziare un @layer più alto in CSS
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Assegnare un valore di default a un parametro di una lambda in C#
Cancellare una run di un workflow di GitHub
C# 12: Cosa c'è di nuovo e interessante
Miglioramenti nelle performance di Angular 16
Usare le navigation property in QuickGrid di Blazor