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
Eseguire una GroupBy per entity in Entity Framework
Utilizzare politiche di resiliency con Azure Container App
Creazione di componenti personalizzati in React.js con Tailwind CSS
Eseguire query verso tipi non mappati in Entity Framework Core
Usare lo spread operator con i collection initializer in C#
Assegnare un valore di default a un parametro di una lambda in C#
Hosting di componenti WebAssembly in un'applicazione Blazor static
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
C# 12: Cosa c'è di nuovo e interessante
Criptare la comunicazione con mTLS in Azure Container Apps
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Evitare la script injection nelle GitHub Actions