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

Il problema è dopo che ho restituito il risultato, la connessione è chiusa e poiché è chiusa, si blocca quando sto tentando di accedere a qualsiasi elemento figlio. Ciò accade perché con il caricamento lazy impostato su True (predefinito) non carica mai le relazioni figlio prima che vengano utilizzate e inizi a utilizzarle DOPO che la connessione è chiusa. Quindi, qual è il modo migliore per risolvere questo?Entity Framework lazy loading

Ho provato a disattivare il caricamento lento ma non ha caricato alcuna tabella delle relazioni figlio.

risposta

14

È possibile caricare sempre in modo esplicito le vostre collezioni bambino:

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

Ok ma cosa succede se voglio caricare TUTTI gli elementi figlio senza dover scrivere esplicitamente include ("ElementName")? C'è un sacco di elementi figlio, ecco perché – syncis

+0

@ user554978 - Questo non è supportato. Devi caricare esplicitamente tutti i bambini in primo piano usando Includi o mantieni la connessione aperta e consenti a Lazy Loading di fare la sua cosa. –

+0

Ah ok grazie mille! – syncis

3

È possibile utilizzare il metodo .include().

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

È possibile anche aggiungere una chiamata result.ChildEntitySet.Load() prima di tornare. Questo è meno efficiente poiché comporterà due viaggi sul server. L'utilizzo del metodo .Include() genererà un'istruzione SQL con un JOIN che consente un solo viaggio al server.

+1

Ok, ma cosa succede se voglio caricare tutti gli elementi figlio senza dover scrivere esplicitamente includere ("ElementName")? C'è un sacco di elementi figlio, ecco perché – syncis

Problemi correlati