2014-06-24 4 views
0

Je mets en place un service Web qui charge et enregistre un contrat d'hôtel. Structure de la classe (simplifiée)Comment charger efficacement des objets complexes dans Entity Framework 6

public class Contract 
{ 
    public int id { get; set; } 
    public virtual ICollection<Season> seasonList { get; set; } 
    public virtual ICollection<Room> roomList { get; set; } 
} 

public class Season 
{ 
    public int id { get; set; } 
    public Contract contract { get; set; } 
    public virtual ICollection<Season_Date> season_DateList { get; set; } 
} 

public class Room 
{ 
    public int id { get; set; } 
    public Contract contract { get; set; } 
    public virtual ICollection<Contingent> contingentList { get; set; } 
} 

public class Season_Date 
{ 
    public int id { get; set; } 
    public Season season { get; set; } 
} 

public class Contingent 
{ 
    public int id { get; set; } 
    public Season season { get; set; } 
    public Room room { get; set; } 
} 

Pour la méthode de chargement, il est nécessaire de charger un contrat avec tous ses détails. Je ne veux pas utiliser include, car il y a beaucoup de tables et de champs impliqués et je crains que la requête résultante soit complexe. Existe-t-il un moyen de charger les enregistrements season_date et contingent en utilisant l'identifiant du contrat?

Répondre

0

Vous pouvez utiliser Lazy Loading, ce qui signifie que les entités associées seront chargées à partir de la base de données la première fois que vous tenterez d'y accéder (bien que cela ne fonctionne pas bien avec la sérialisation). Vous configurez le chargement paresseux sur la propriété Configuration de votre classe DbContext:

public class MyDbContext : DbContext 
{ 
    public MyDbContext() 
    { 
     this.Configuration.LazyLoadingEnabled = true; 
    } 
} 

propriétés des relations doivent être virtuel, mais vous avez déjà fait.

Et si vous connaissez déjà l'identifiant du contrat, pourquoi ne pouvez-vous pas simplement faire ce qui suit?

var contract = myDbContext.Contracts.FirstOrDefault(c => c.id == idIWant); 

Plus d'informations sur les entités liées au chargement est disponible on this msdn page.

+0

salut. Le chargement paresseux ferait l'affaire, mais il n'est pas très efficace, quand je sais déjà, que j'ai besoin du graphique d'objet plein. Si j'ai 5 saisons et 2 dates par saison, qu'en utilisant le chargement différé je reçois 7 requêtes à la base de données (contrat + liste de saison + 5 x liste de season_date). mais en utilisant une jointure au contrat ou en créant une requête in (id list), les mêmes données pourraient être récupérées dans 3 requêtes (contrat + liste de saison + liste de season_date par contrat-id). –

Questions connexes