2013-02-20 2 views
5

Ok, quindi in base allo this page, Entity Framework deve caricare con impazienza più livelli utilizzando uno Select all'interno del metodo Include.Entity Framework Eager Caricamento di più livelli Eccezione

Ho il codice seguente:

var reports = _context.Reports 
    .Include(rt => rt.Fields) 
    .Include(rt => rt.Fields.Select(f => f.FieldType)) 
    .Include(rt => rt.Fields.Select(f => f.FieldType.FieldIdentifier)); 

Eppure questo getta un InvalidOperationException - "tipo non valido di espressione" sulla chiamata alla seconda includere. L'eccezione proviene da EntityFrameworkHelper.CollectRelationalMemebers.

Ho anche provato a utilizzare le stringhe per le proprietà relative a Include, ma anche questo ha avuto esito negativo (preferisco evitare di utilizzare le stringhe se possibile).

Sto usando la DLL EF 5.0 per .NET 4.0. Le mie classi EF sono database vecchio stile EntityObject s.

Qualcuno conosce la causa e se c'è qualcosa che posso fare su questa eccezione?

EDIT:

Quando si utilizza la versione stringa:

var reports = _context.Reports 
    .Include("Fields") 
    .Include("Fields.FieldType") 
    .Include("Fields.FieldType.FieldIdentifier")); 

getta InvalidOperationException - tipo non valido di espressione.

+0

Qual è il messaggio di eccezione esatto quando si utilizza la versione basata su stringa di "Include"? – Slauma

+0

Vedere la risposta sopra. – MgSam

+0

Intendevo l'eccezione per la ** versione ** basata su stringa di "Include". – Slauma

risposta

0

La questione ha finito per essere che un 3rd party Include metodo di estensione in una DLL che avevamo stia usando era sempre la precedenza su Include di Entity Framework. Il terzo partito stava gettando le eccezioni. Dopo averlo rimosso, il problema è stato risolto.

Uno dei problemi con metodi di estensione ...

Grazie per l'aiuto di tutti.

19

Sono inclusi ridondanti. Hai solo bisogno dell'ultima inclusione, che includerà qualsiasi cosa in quel percorso. Esempio:

var reports = _context.Reports 
    .Include(rt => rt.Fields.Select(f => f.FieldType.FieldIdentifier));