web-dev-qa-db-fra.com

Comment inclure avec enthousiasme les éléments enfant et petit-enfant d'une entité dans Entity Framework Code First?

Imaginez trois entités (client, livre, auteur) liées comme suit:

Un client a beaucoup de livres

Un livre a un auteur

J'utilise ces données pour imprimer un rapport comme celui-ci:

Customer: Peter
  Book: To Kill a Mockingbird - Author: Harper Lee
  Book: A Tale of Two Cities - Author: Charles Dickens
Customer: Melanie
  Book: The Hobbit - Author: J. R. R. Tolkien

Comme je le fais pour les clients, je reçois, comme prévu, un ensemble de requêtes de la nature suivante

  1. Une requête pour obtenir les clients
  2. Une requête par client pour obtenir ses livres
  3. Une requête par livre pour obtenir son auteur

Je peux réduire le nombre de requêtes en incluant les livres comme suit:

var clients = db.Customers.Include (c => c.Books);

Mais je ne sais pas comment charger le troisième niveau (Auteur). Comment puis je faire ça?

56
adolfojp

Il y a une surcharge pour Include qui accepte une chaîne qui peut indiquer le chemin complet de toutes les propriétés supplémentaires dont vous avez besoin:

var customers = db.Customers.Include("Books.Author");

Cela semble étrange, car "Auteur" n'est pas une propriété d'une collection de livres (mais une propriété de chaque livre), mais cela fonctionne. Essayer.

45
Matt Hamilton

De plus, il n'est pas nécessaire d'utiliser la surcharge de chaîne. Cette méthode fonctionnera aussi:

var customers = db.Customers.Include(c => c.Books.Select(b => b.Author));

Pour plus d'exemples, consultez l'article de blog de l'équipe EF: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part- 6-loading-related-entity.aspx

Et ce tutoriel: http://www.asp.net/entity-framework/tutorials/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

141
tdykstra