178 votes

C # Entity-Framework: Comment combiner un .Find et .Include sur un objet de modèle?

Je suis en train de faire la mvcmusicstore pratique tutoriel. J'ai remarqué quelque chose lors de la création de l'échafaudage pour le gestionnaire d'album (ajouter supprimer modifier).

Je veux écrire du code élégamment, donc je suis à la recherche de la propre manière d'écrire.

Pour info je suis en train de faire le magasin le plus générique:

Albums = Éléments

Genres = Catégories

Artiste = Marque

Voici comment l'index est récupéré (généré par MVC):

var items = db.Items.Include(i => i.Category).Include(i => i.Brand);

Voici comment l'élément à supprimer est extrait:

Item item = db.Items.Find(id);

Le premier apporte tous les éléments et les remplit de la catégorie et les modèles de la marque à l'intérieur de l'élément de modèle. La deuxième, ne pas remplir la catégorie et la marque.

Comment puis-je écrire le deuxième à faire de la recherche ET de remplir ce qui est à l'intérieur (de préférence en 1 ligne)... en théorie - quelque chose comme:

Item item = db.Items.Find(id).Include(i => i.Category).Include(i => i.Brand);

200voto

Dennis Traub Points 24186

Vous devez d'abord utiliser Include() , puis récupérer un seul objet à partir de la requête résultante:

 Item item = db.Items
              .Include(i => i.Category)
              .Include(i => i.Brand)
              .SingleOrDefault(x => x.ItemId == id);
 

94voto

Learner Points 841

La réponse de Dennis utilise Include et SingleOrDefault . Ce dernier fait le tour de la base de données.

Une autre solution consisterait à utiliser Find , en combinaison avec Load , pour le chargement explicite d'entités liées.

Ci-dessous un exemple MSDN:

 using (var context = new BloggingContext()) 
{ 
  var post = context.Posts.Find(2); 

  // Load the blog related to a given post 
  context.Entry(post).Reference(p => p.Blog).Load(); 

  // Load the blog related to a given post using a string  
  context.Entry(post).Reference("Blog").Load(); 

  var blog = context.Blogs.Find(1); 

  // Load the posts related to a given blog 
  context.Entry(blog).Collection(p => p.Posts).Load(); 

  // Load the posts related to a given blog  
  // using a string to specify the relationship 
  context.Entry(blog).Collection("Posts").Load(); 
}
 

Bien sûr, Find renvoyé immédiatement sans faire de demande au magasin, si cette entité est déjà chargée par le contexte.

1voto

Johan Points 1

Cela n'a pas fonctionné pour moi. Mais je l'ai résolu en faisant comme ça.

 var item = db.Items
             .Include(i => i.Category)
             .Include(i => i.Brand)
             .Where(x => x.ItemId == id)
             .First();
 

Ne sais pas si c'est une solution acceptable. Mais l'autre que Dennis m'a donné m'a donné une erreur bool in .SingleOrDefault(x => x.ItemId = id);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X