La classe DbContext di Entity Framework Core espone la proprietà ChangeTracker di tipo ChangeTracker. Questa classe mette a disposizione il metodo TrackGraph che permette di attaccare un oggetto al contesto e di avere un callback per ogni oggetto complesso che questo referenzia così da poter impostare anche lo stato degli oggetti collegati.
Per fare un esempio, supponiamo di avere un ordine a cui abbiamo collegati un cliente e i dettagli. Se invochiamo il metodo Add del contesto, tutti gli oggetti collegati all'ordine vengono impostati in stato Added e verranno quindi inseriti quando invochiamo il metodo SaveChanges. Se per l'ordine e i dettagli questo è il comportamento desiderato, per il cliente invece dovremmo poter impostare lo stato di Unchanged. Con il metodo TrackGraph possiamo ottenere questo risultato usando il seguente codice.
var order = new Order { ... }; context.ChangeTracker.TrackGraph(order , e => { if (e.Entry.IsKeySet) { e.Entry.State = EntityState.Unchanged; } else { e.Entry.State = EntityState.Added; } });
Il primo parametro del metodo accetta l'oggetto principale (l'ordine nel nostro caso). Il secondo parametro è una funzione che viene invocata per l'oggetto principale e per ogni oggetto a esso collegato (nel nostro caso per il cliente o per ogni ordine). Se la chiave primaria è impostata (come sicuramente lo è per il cliente), l'oggetto viene impostato in stato di Unchanged, in caso contrario (come per l'ordine e i dettagli) viene impostato in stato di Added.
Ovviamente questa è la logica usata nel nostro esempio, ma può essere completamente personalizzata in base alle necessità.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Utilizzare Hybrid Cache in .NET 9
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Abilitare automaticamente il force push di un gruppo su Azure DevOps
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Gestione dell'annidamento delle regole dei layer in CSS
Anonimizzare i dati sensibili nei log di Azure Front Door
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Proteggere le risorse Azure con private link e private endpoints
Evitare memory leaks nelle closure JavaScript
Creare una libreria CSS universale: Nav menu
Fornire parametri ad un Web component HTML