Abilitare e disabilitare il Lazy Loading con Entity Framework

Una delle funzionalità più interessanti dell’Entity Framework è la possibilità di differire il caricamento dei dati negli oggetti di tipo Entity: questa caratteristica, nota come Lazy Loading, consente di alleggerire notevolmente il carico sul Database in quanto le query vengono effettuate soltanto nel momento in cui il codice ha effettivamente bisogno di valorizzare la proprietà richiesta.

Per capire meglio come funziona, prendiamo ad esempio il seguente sistema di classi di tipo Entity:

Possiamo notare come la proprietà StudentAddress della classe Student sia un tipo complesso che fa riferimento a una Entity specifica (StudentAddress), a sua volta relativa a una tabella presente nel nostro Database. Richiamando una lista di studenti con la proprietà LazyLoading abilitata il nostro data provider caricherà tutti gli studenti dal DB, ma non si preoccuperà di valorizzare la proprietà StudentAddress fino a quando il nostro codice non la richiederà esplicitamente con una chiamata apposita.

 

Disabilitare il Lazy Loading

In Entity Framework 4 e successive il Lazy Loading è abilitato per impostazione predefinita. E’ possibile disabilitarlo sia globalmente, a livello di DbContext, che selettivamente, a livello di singola proprietà.

Per disabilitarlo a livello globale è sufficiente impostare la proprietà LazyLoadingEnabled dell’oggetto Configuration del DbContext in fase di inizializzazione dell’oggetto:

Per disabilitarlo a livello di singola proprietà è sufficiente rimuovere l’attributo virtual. Riprendendo l’esempio precedente, è sufficiente modificare la classe Student nel seguente modo:

IMPORTANTE: Non commettete l’errore di pensare che, una volta disabilitato il Lazy Loading, il framework valorizzerà automaticamente tutte le proprietà relative a oggetti correlati: al contrario, una volta che lo avrete disabilitato dovrete essere voi (e il vostro codice) a farvi carico in modo esplicito di tale operazione. Vediamo come.

 

Caricare manualmente i dati

Il caricamento manuale dei dati può essere effettuato in due modi: a livello di Entity Request (Eager Loading) oppure a livello di singola proprietà.

 

Property Loading

Il metodo più semplice è il cosiddetto Property Loading, ottenibile utilizzando il metodo Load() messo a disposizione dall’ entity framework:

Il metodo può essere utilizzato anche nel caso di relazioni uno a molti. Ad esempio, nel caso in cui volessimo valorizzare anche la collection virtuale Teachers prevista per ciascun elemento Student potremmo procedere nel seguente modo:

 

Eager Loading

Il procedimento noto come Eager Loading consiste nel caricare sia le Entity che una o più Entity ad esse correlate. Per impostarlo è necessario utilizzare il metodo Include() nel seguente modo:

IMPORTANTE: Se il compilatore non riconosce il metodo Include(), assicuratevi di aver aggiunto un riferimento al namespace System.Data.Entity al vostro codice.

E’ anche possibile utilizzare l’Eager Loading per valorizzare relazioni su più livelli. Ad esempio, nel caso in cui volessimo valorizzare anche la collection virtuale StudentAddressDetails per ciascun elemento StudentAddress (cfr. definizione della classe a inizio articolo) potremmo procedere nel seguente modo:

E così via.

Per il momento è tutto: felice sviluppo!

 

RELATED POSTS

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane.

View all posts by Ryan