2012-05-17 5 views
5

LazyLoadingEnabled è impostato su true per impedire il caricamento delle entità correlate nel contesto che sto utilizzando.DBContext lazyloadingenabled impostato su true still carichi entità correlate per impostazione predefinita

Una classe di farmaci contiene un elenco di oggetti di identità del farmaco.

public class Drug 
{ 
    public virtual List<DrugIdentity> DrugIdentities { get; set; } 
} 

Una configurazione specifica per la classe imposta la chiave e ha molte relazioni se si desidera includere l'entità correlata da caricare.

public DrugConfiguration() 
    { 
     this.HasKey(d => d.DrugID); 
     this.HasMany(d => d.DrugIdentities).WithOptional(d => d.Drug).Map(d => d.MapKey("DrugID")); 
    } 

Quando il contesto Drug viene caricato utilizzando una query LINQ dell'oggetto mostra contiene DrugIdentities correlate quando non dovrebbe.

context.Configuration.LazyLoadingEnabled = true; 

        var drugs = from d in context.Drug 
           where d.Active == true 
           select d; 

farmaci [0] count = 1

mi aspetterei farmaci [0] .DrugIdentities alla parità di NULL dal lazyloading è stato impostato a true .DrugIdentities?

+6

Sembra che tu stia fraintendendo il carico pigro come l'opposto di quello che è in realtà. Caricamento lento indica che i dati ** vengono ** caricati automaticamente quando si accede a una proprietà di navigazione. Il ** contrario ** di questo, caricamento avido, è quando ottieni valori null per le proprietà della relazione a meno che tu non li carichi esplicitamente (con entusiasmo). –

risposta

3

Per disabilitare il caricamento lazy, impostare LazyLoadingEnabled su false anziché su true. Vedere Pigro, Eager, e caricamento esplicito di dati correlati in

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+0

LazyLoadingEnabled è impostato su true perché non desidero che carichi i dati. Quello che sta accadendo è che è ansioso di caricare le entità correlate quando non dovrebbe essere. – bretcj7

+0

Come fai a sapere che è carico impaziente? L'atto stesso di provare a ispezionare una proprietà di navigazione attiva il caricamento lento. Con il caricamento lento non è possibile vedere una proprietà di navigazione nulla se ci sono entità correlate da caricare. – tdykstra

+0

Anche quando si visualizza l'oggetto, la proprietà senza espansione mostra un Conteggio = 1 per la proprietà DrugIdentities. Ciò innescherà ancora il caricamento semplicemente osservando la classe di livello superiore che è popolata? – bretcj7

2

è necessario impostare specificamente ProxyCreationEnabled = false se si desidera impostare LazyLoadingEnabled = true.

Il test ha superato quello che mi aspettavo. La prima query restituisce l'oggetto Drugs e NULL per DrugEntities. La seconda query restituisce lo DrugEntities poiché ho utilizzato lo Include per eseguire il caricamento ansioso.

var queryDrug = from d in context.Drug 
           where d.Active == true 
           select d; 

       var drugresults = from d in context.Drug.Include(e => e.DrugIdentities) 
            where d.Active == true 
            select d; 
+9

La tua prima affermazione non è corretta. È possibile impostare ProxyCreationEnabled e LazyLoadingEnabled su true. Correggere questo per i futuri googler. – onefootswill

+1

L'impostazione 'ProxyCreationEnabled = false' e' LazyLoadingEnabled = true' ha fatto il trucco per me. –

+0

scusa ma ProxyCreation non deve essere falso per impostare LazyLoadingEnabled su true. Questi sono indipendenti. – MemeDeveloper