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
Creare una libreria CSS universale: Cards
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Referenziare un @layer più alto in CSS
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Utilizzare Azure AI Studio per testare i modelli AI
Loggare le query più lente con Entity Framework
Creare una libreria CSS universale: Immagini
Aprire una finestra di dialogo per selezionare una directory in WPF e .NET 8
Disabilitare automaticamente un workflow di GitHub (parte 2)
Utilizzare WhenEach per processare i risultati di una lista di task
Gestione degli eventi nei Web component HTML
Utilizzare Copilot con Azure Cosmos DB
I più letti di oggi
- Creare agenti facilmente con Azure AI Agent Service
- Loggare le query più lente con Entity Framework
- Rendere i propri workflow e le GitHub Action utilizzate più sicure
- Disabilitare le run concorrenti di una pipeline di Azure DevOps
- Fornire parametri ad un Web component HTML
- Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
- Gestione degli eventi nei Web component HTML
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9