2011-01-10 4 views
8
using(DataContext db = new DataContext()) 
{ 
    var result = db.SomeTable.ToList(); 
    return result; 
} 

Le problème est après avoir renvoyé le résultat, la connexion est fermée et parce qu'elle est fermée, elle se bloque lorsque j'essaie d'accéder à l'un des éléments enfants. Cela arrive parce que le chargement paresseux a la valeur True (par défaut), il ne charge jamais les relations enfants avant qu'ils ne soient utilisés et je commence à les utiliser APRÈS que la connexion est fermée. Alors, comment est la meilleure façon de résoudre cela?Entity Framework paresseux chargement

J'ai essayé de désactiver le chargement paresseux, mais il n'a pas chargé l'une des tables de relations enfants.

Répondre

14

Vous pouvez toujours explicitement charger vos collections enfants:

var result = db.SomeTable.Include("SomeChildCollectionName") 
         .Include("AnotherChildCollectionName") 
         .ToList(); 
+0

Ok, mais si je veux charger TOUS les éléments enfants sans avoir à écrire explicitement include ("ElementName")? Il y a beaucoup d'éléments enfants, c'est pourquoi – syncis

+0

@ user554978 - Ce n'est pas supporté. Vous devez charger explicitement tous les enfants à l'aide d'Include ou laisser la connexion ouverte et permettre à Lazy Loading de faire son travail. –

+0

Ah ok merci beaucoup! – syncis

3

Vous pouvez utiliser la méthode .include().

var result = db.SomeTable.Include("ChildEntitySet").ToList(); 

Vous pouvez également ajouter un appel result.ChildEntitySet.Load() avant de retourner. Ceci est moins efficace car il en résultera deux voyages sur le serveur. L'utilisation de la méthode .Include() générera une instruction SQL avec un JOIN permettant un seul déplacement sur le serveur.

+1

Ok, mais si je veux charger tous les éléments de l'enfant sans avoir à écrire explicitement inclure (« ElementName »)? Il y a beaucoup d'éléments enfants, c'est pourquoi – syncis

Questions connexes