Una delle nuove funzionalità introdotte in Entity Framework Core rispetto a Entity Framework 6 è la possibilità di gestire il vincolo Cascade Delete. Se in fase di mapping impostiamo il vincolo di Cascade Delete tra due oggetti, quando cancelliamo il padre Entity Framework Core cerca di cancellare tutti i figli caricati nel contesto. Questo viene fatto inviando un comando di DELETE al database per ogni oggetto figlio caricato nel contest e poi per l'oggetto padre. Ne consegue che se non tutti i figli sono caricati nel contesto la cancellazione fallisce perchè alcuni figli non sono stati rimossi dal database prima di rimuovere il padre. Per ovviare a questo problema dobbiamo specificare il vincolo di Cascade Delete anche sul database. Una volta specificato questo vincolo non abbiamo la necessità di caricare i figli nel contesto prima di cancellare il padre in quanto sarà il database automaticamente a rimuovere i figli quando cancella il padre.
In questo primo esempio vediamo come impostare il Cascade Delete.
modelBuilder.Entity<Order>() .HasMany(b => b.Details) .WithOne(b => b.Order) .OnDelete(DeleteBehavior.Cascade);
In questo secondo esempio vediamo come cancellare un ordine. Nel primo caso non c'è il vincolo di Cascade Delete sul database quindi carichiamo tutti i dettagli così che possano essere cancellati. Nel secondo caso c'è il vincolo sul database quindi carichiamo solo l'ordine.
using (var db = new OrderContext()) { var order = db.Orders.Include(b => b.Details).First(); db.Remove(order); db.SaveChanges(); } using (var db = new OrderContext()) { var order = db.Orders.First(); db.Remove(order); db.SaveChanges(); }
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
Miglioramenti agli screen reader e al contrasto in Angular
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Eseguire query verso tipi non mappati in Entity Framework Core
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Utilizzare ChatGPT con Azure OpenAI
Sfruttare al massimo i topic space di Event Grid MQTT
Usare un KeyedService di default in ASP.NET Core 8
Miglioramenti nelle performance di Angular 16
Assegnare un valore di default a un parametro di una lambda in C#
Eseguire una query su SQL Azure tramite un workflow di GitHub
Definire lo stile CSS in base alle dimensioni del container