2010-06-03 15 views
55

Sembra che il caricamento lazy sia abilitato per impostazione predefinita in EF4. Almeno, nel mio progetto, posso vedere che il valore diDisabilita il caricamento lazy per impostazione predefinita in Entity Framework 4

dataContext.ContextOptions.LazyLoadingEnabled 

è true per impostazione predefinita. Non voglio caricare pigro e non voglio scrivere:

dataContext.ContextOptions.LazyLoadingEnabled = false; 

ogni volta che ottengo un nuovo contesto. Quindi c'è un modo per disattivarlo di default, ad esempio, attraverso l'intero progetto?

risposta

63

La risposta seguente si riferisce a Database-First o Model-First flusso di lavoro (gli unici due flussi di lavoro che erano disponibili con Entity Framework (versione < = 4.0) quando la domanda è stata posta). Se si utilizza il flusso di lavoro Code-First (disponibile dalla versione EF> = 4.1) passare a ssmith answer a questa domanda per una soluzione corretta.


Il file edmx ha nella definizione <ConceptualModel> e <EntityContainer> un attributo per pigri carico dove è possibile impostare lazy loading in generale su false:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false"> 

Questo crea la seguente impostazione nel costruttore ObjectContext:

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") 
{ 
    this.ContextOptions.LazyLoadingEnabled = false; 
    OnContextCreated(); 
} 

Il mio esempio non è inteso in questo modo il ObjectContext generato (o DbContext nelle nuove versioni EF) dovrebbe essere modificato manualmente (che verrebbe sovrascritto da ogni aggiornamento del modello dal database, come indicato da Ctorx) ma che l'elemento nella sezione edmx:ConceptualModels del file EDMX debba essere modificato aggiungendo l'attributo annotation:LazyLoadingEnabled="false" - manualmente in un editor XML o nella pagina delle proprietà della superficie del designer dove è disponibile anche questa opzione. Questa modifica del file EDMX genererà automaticamente la classe di contesto con l'opzione di caricamento lazy disabilitato nel costruttore, come mostrato sopra. La stessa modifica del file EDMX non viene sovrascritta quando il modello viene aggiornato dal database.

+0

Perfetto, grazie. –

+15

Ciò richiede di modificare il codice generato, che verrà sovrascritto se si modifica il modello. Prendi in considerazione la possibilità di collocare ObjectContextFactory e apportare le modifiche in fabbrica. In questo modo continuerai a impostare l'opzione solo una volta e non cambierai il codice generato automaticamente. – ctorx

+0

@ctorx - AFAICT, un'opzione più semplice rispetto alla fabbrica sarebbe implementare solo l'OnContextCreated parziale per disattivare il caricamento lento? O mi sta sfuggendo qualcosa? –

58

Ho scritto un esempio rapido che mostra how the new Lazy Loading features work with EF Code First. Il raggiungimento di ciò che si desidera nel Codice Primo modello è semplicemente una questione di aggiungere una riga al vostro costruttore di DbContext, in questo modo:

public BlogContext() 
{ 
    this.Configuration.LazyLoadingEnabled = false; 
} 
+10

Non che importi molto, ma entrambi ': base()' e 'questo' sono ridondanti in questo codice. –

+0

In termini di funzionalità, sì, in termini di leggibilità penso che a volte sia utile includere "questo". Sono d'accordo su 'base()' però, non riesco a pensare a un motivo per aggiungerlo. –

+0

Sì, non sono sicuro del perché la base() sia mai esistita. Rimosso. – ssmith

24

Se si sta utilizzando EF4 Codice primo luogo, sì? Quindi, nell'inizializzazione del tuo contesto, c'è l'override di "OnModelCreated".

In questo metodo, ho semplicemente richiamato e impostato la proprietà e tutto è stato risolto.

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.Configuration.LazyLoadingEnabled = false; 
} 

Il mio modello è ora molto più appetibile. Il caricamento lento è ottimo ... ma non quando non lo vuoi. E quando inizi ad avere riferimenti circolari, è semplicemente ridicolo.

+4

Questo non funzionerà perché disabiliterà il caricamento lazy solo per l'istanza di contesto che crea il modello (di solito la prima istanza utilizzata dopo l'avvio dell'applicazione). Per tutte le istanze di contesto successive, 'OnModelCreating' non viene chiamato e' LazyLoadingEnabled' avrà il valore predefinito - che è 'true'. – Slauma

+0

@Slauma - Ho raggiunto lo stesso identico problema oggi e ho modificato questa risposta (poiché è accettata) per modificarla e impostarla nel Ctor. Se avessi il potere di cambiare la risposta accettata da questa alla tua, lo farei invece. :) –

+1

@JamesManning: questa domanda ha una storia strana. La mia risposta è stata accettata fino a pochi mesi fa. Ma la mia risposta non è buona (il critico Ctorx è molto valido). Quindi il proprietario della domanda ha spostato l'accettazione su questo, che era completamente sbagliato fino alla modifica. Inoltre è una risposta per 'DbContext' che è uscito molto più tardi rispetto alla domanda è stata posta e i frammenti di codice nella domanda sono ancora per' ObjectContext'. Ora lo hai modificato con una risposta corretta per 'DbContext' ma è la stessa ora come la risposta di ssmith che dura da più di un anno. Ma entrambi non sono una risposta per "ObjectContext". Piuttosto pazzo :) – Slauma

21

Puoi farlo anche dal designer. Basta aprire il file .edmx, fare clic con il tasto destro del mouse su qualsiasi punto del modello e scegliere Proprietà. Quindi impostare LazyLoadingEnabled su falso. enter image description here

4

Se si esegue la modellazione del codice, rimuovere semplicemente la parola chiave virtual sulle proprietà di riferimento/oggetto. Avere virtual su un riferimento abiliterà LazyLoading su quel particolare riferimento.

Problemi correlati