2009-06-11 13 views
4

J'ai actuellement une base de données composée de nombreux objets liés.Entity Framework Chargement des associations à plusieurs niveaux

simplifié avec moins d'objets:

Song => Versions => Info 
      || 
      \/ 
     Data 

Maintenant, je comprends que je peux charger désireux tous ces objets lors de l'utilisation

db.Song.include("Versions.Data").Include("Versions.Info").ToList(); 

Cependant, quand je veux seulement 1 chanson avec ses données cela entraînera charger toutes les chansons et toutes les références.

est-il un moyen plus facile comme:

db.Song.First().include("Versions.Data").Include("Versions.Info") 

Ou dois-je vraiment utiliser:

Song.Versions.Load(); 
foreach(Version version in versions) 
{ 
    version.DataReference.Load(); 
    version.InfoReference.Load(); 
} 

Il est faisable si vous avez quelques objets liés, mais je vais avoir comme 10 objets qui ont subojects eux-mêmes aussi ...

S'il vous plaît montrez-moi un meilleur moyen.

Répondre

1

Vous venez d'écrire ceci:

var song = (from s in db.Song.Include("Versions.Data").Include("Versions.Info") 
      where s.ID == 1 // i.e. some filter here 
      select s).First(); 

Si pour une raison quelconque, cela ne fait pas en fait le « Inclure » (il pourrait échouer si vous faites des choses intéressantes dans votre clause where) vérifier Conseil pour une solution: Tip 22 - How to make Include really Include

Hope this helps

Alex

+0

Mais cela ne charge-t-il pas d'abord toutes les chansons et références, puis sélectionne le premier? IE: Ne charge-t-il réellement que les références de chanson avec id = 1? – Peterdk

+0

Il charge uniquement les références à la chanson 1. –

0

Vous pouvez également écrire comme (en VB)

dim song = db.Song.Include("Versions.Data").Include("Versions.Info").Where(Function(s) s.ID = 1).FirstOrDefault() 
Questions connexes