2010-11-28 14 views
1
 public void Delete(Dinner dinner) 
     { 
      List<RSVP> rsvps = dinner.RSVPs.ToList();// This clone looks inefficient. 

      foreach (RSVP rsvp in rsvps) 
       entities.RSVPs.DeleteObject(rsvp); 

      entities.Dinners.DeleteObject(dinner); 
     } 

alt textDans EF, est-il efficace de supprimer une ligne parente en supprimant les lignes enfant la référençant d'abord via les clones de ligne enfant?

QUESTION:

Suppression d'une ligne de parent en supprimant les lignes enfants faisant référence d'abord à travers les clones de ligne enfant semble inefficace. La duplication des lignes enfant consommera d'énormes ressources, je pense.

Si oui, quelle est la meilleure façon?

EDIT 1:

namespace NerdDinner.Models 
{ 
    public class DinnerRepository 
    { 
     private NerdDinnerEntities entities = new NerdDinnerEntities(); 

     public IQueryable<Dinner> FindAllDinners() 
     { 
      return entities.Dinners; 
     } 

     public IQueryable<Dinner> FindUpcomingDinners() 
     { 
      return from dinner in entities.Dinners 
        where dinner.EventDate > DateTime.Now 
        orderby dinner.EventDate 
        select dinner; 
     } 

     public Dinner GetDinnerByID(int DinnerID) 
     { 
      return entities.Dinners.FirstOrDefault(d => d.DinnerID == DinnerID); 
     } 

     public void Add(Dinner dinner) 
     { 
      entities.Dinners.AddObject(dinner); 
     } 

     public void Delete(Dinner dinner) 
     { 
      //List<RSVP> rsvps = dinner.RSVPs.ToList(); 

      //foreach (RSVP rsvp in dinner.RSVPs) 
      // entities.RSVPs.DeleteObject(rsvp); 

      entities.Dinners.DeleteObject(dinner); 
     } 

     public void Save() 
     { 
      entities.SaveChanges(); 
     } 
    } 
} 
+1

Vous ne pouvez pas faire cela au niveau de la base de données, définissez la règle de suppression à cascade sur la clé étrangère. – Doggett

+0

OK. Merci. Donc j'ai juste besoin de supprimer l'objet du dîner. – xport

+1

Oui. la base de données supprimera les objets enfants pour vous. Doggett tu aurais dû donner ceci comme réponse :) maintenant je ne peux pas le donner ... puisque tu l'as inventé en premier ... et aucun d'entre nous n'a la réputation :) – basarat

Répondre

1

Définissez la règle de suppression de cascade sur la clé étrangère, lorsque vous supprimez le dîner objet la base de données supprimera automatiquement tous les enregistrements enfants. Gardez à l'esprit que cela ne sera probablement pas reflété dans EF, de sorte que tous les objets déjà en mémoire ne seront pas marqués comme effacés.

+0

Alors, que dois-je faire pour éviter ce problème? – xport

+0

Avec vos 2 tables actuelles cela ne devrait pas poser de problème, en supposant que les RSVP ne sont pas accessibles en dehors des dîners de toute façon – Doggett

+0

S'il vous plaît voir mon EDIT 1. Si j'utilise le modèle de dépôt comme indiqué ci-dessus, instancier la classe de référentiel une méthode, le problème que vous avez dit ci-dessus se produit encore? Ou devrais-je déplacer l'objet datacontext vers la déclaration locale au lieu de la déclaration au niveau de la classe? – xport