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
Generare file PDF da Blazor WebAssembly con iText
Creare alias per tipi generici e tuple in C#
Recuperare un elemento inserito nella cache del browser tramite API JavaScript
Utilizzare i primary constructor di C# per inizializzare le proprietà
Eseguire una GroupBy per entity in Entity Framework
Utilizzare domini personalizzati gestiti automaticamente con Azure Container Apps
Usare le collection expression per inizializzare una lista di oggetti in C#
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Configurare dependabot per aggiornare le dipendenze di terze parti con GitHub Actions
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI
Eseguire le GitHub Actions offline