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
Cancellare una run di un workflow di GitHub
Generare un hash con SHA-3 in .NET
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Il nuovo controllo Range di Blazor 9
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Utilizzare Copilot con Azure Cosmos DB
La gestione della riconnessione al server di Blazor in .NET 9
Proteggere le risorse Azure con private link e private endpoints
Change tracking e composition in Entity Framework
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Ricevere notifiche sui test con Azure Load Testing
Loggare le query più lente con Entity Framework