Gestire il Cascade Delete in Entity Framework Core

di Stefano Mostarda, in LINQ, Entity Framework,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi