Sei sulla pagina 1di 4

15/4/2014

Caricamento di oggetti correlati (Entity Framework)


Ulteriori informazioni

Utilizzando il sito si accetta luso di cookies per analisi, risultati personalizzati e pubblicit.

Caricamento di oggetti correlati (Entity Framework)


Questo argomento non stato ancora valutato In questo argomento vengono descritti i modelli che possibile utilizzare per caricare entit correlate. I tipi di entit possono definire le propriet di navigazione che rappresentano le associazioni nel modello di dati. possibile utilizzare queste propriet per caricare entit correlate all'entit restituita dall'associazione definita. Quando vengono generate entit basate sul modello di dati, vengono generate propriet di navigazione per entrambe le entit finali di un'associazione. Queste propriet di navigazione restituiscono un riferimento sul lato "uno" di una relazione uno-a-uno o molti-a-uno o una raccolta sul lato "molti" di una relazione uno-a-molti o molti-a-molti. Per ulteriori informazioni, vedere Propriet di navigazione e Definizione e gestione delle relazioni (Entity Framework).
.NET Framework 4

Nei modelli seguenti vengono descritte la modalit di caricamento delle entit correlate:

Modello di caricamento Specificato nella query

Descrizione possibile creare una query Entity SQL o LINQ to Entities che navighi in modo esplicito tra le relazioni utilizzando le propriet di navigazione. Quando si esegue una query di questo tipo, vengono restituite le entit correlate incluse come propriet di navigazione nella proiezione pi esterna della query. Per ulteriori informazioni, vedere Procedura: spostarsi nelle relazioni utilizzando le propriet di navigazione (Entity Framework).

Caricamento esplicito

Per caricare in modo esplicito le entit in ObjectContext sono necessari pi round trip al database e potrebbe essere necessaria la funzionalit MARS (Multiple Active Result Set), ma la quantit di dati restituiti limitata esclusivamente alle entit caricate. Utilizzare il metodo Load su un oggetto EntityCollection o EntityReference o il metodo LoadProperty sull'oggetto ObjectContext per recuperare in modo esplicito le entit correlate dall'origine dati. Ogni chiamata al metodo Load apre una connessione al database per recuperare le informazioni correlate. In questo modo si garantisce che una query non venga mai eseguita senza una richiesta esplicita dell'entit correlata. Il caricamento esplicito il comportamento predefinito di Entity Framework . Nota: Prima della chiamata a Load, una quantit ridotta di informazioni sull'entit correlata gi caricata in ObjectContext. Per ulteriori informazioni, vedere la sezione Explicitly Loading Related Objects di questo argomento.

Caricamento lazy

Con questo tipo di caricamento le entit correlate vengono caricate automaticamente dall'origine dati quando si accede a una propriet di navigazione. inoltre necessario tenere presente che ogni propriet di navigazione a cui si accede produce come risultato l'esecuzione di una query separata sull'origine dati se l'entit non gi in ObjectContext. Per ulteriori informazioni, vedere la sezione Lazy Loading di questo argomento.

Caricamento eager Oppure Definizione dei percorsi della query con Include

Se si conosce la forma esatta del grafico delle entit correlate che l'applicazione richiede, possibile utilizzare il metodo Include nell'oggetto ObjectQuery per definire un percorso della query che controlli quali entit correlate restituire come parte della query iniziale. Quando si definisce un percorso della query, necessaria una sola richiesta nel database per restituire tutte le entit definite dal percorso in un singolo set di risultati. Tutte le entit correlate del tipo specificato nel percorso vengono caricate con ciascun oggetto restituito dalla query. Per ulteriori informazioni, vedere la sezione Defining a Query Path to Shape Query Results di questo argomento.

Caricamento esplicito di oggetti entit correlati


Per caricare in modo esplicito entit correlate, necessario chiamare il metodo Load sull'entit finale correlata restituita dalla propriet di navigazione. Per una relazione uno-a-molti, chiamare il metodo Load su EntityCollection, mentre per una relazione uno-a-uno, chiamare il metodo Load su EntityReference . Se si utilizzano entit POCO, specificare il metodo LoadProperty sull'oggetto ObjectContext. Per ulteriori informazioni, vedere Caricamento di entit POCO correlate (Entity Framework). Il metodo LoadProperty pu essere utilizzato anche con le entit derivate da EntityObject. Questi metodi caricano i dati degli oggetti correlati nel contesto dell'oggetto. Quando vengono restituiti risultati da una query, possibile enumerare la raccolta di oggetti utilizzando un ciclo foreach (For Each...Next in Visual Basic) e chiamare in modo condizionale il metodo Load sulle propriet EntityReference e EntityCollection per ogni entit inclusa nei risultati.

http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx

1/4

15/4/2014
Nota:

Caricamento di oggetti correlati (Entity Framework)

Quando si chiama il metodo Load durante un'enumerazione foreach (C#) o For Each (Visual Basic), Entity Framework tenta di aprire un nuovo lettore dati. Questa operazione non verr eseguita correttamente a meno che non sia stata abilitata la funzionalit MARS (Multiple Active Result Set) specificando multipleactiveresultsets=true nella stringa di connessione. Per ulteriori informazioni, vedere Using Multiple Active Result Sets (MARS) in MSDN. anche possibile caricare il risultato della query in una raccolta List. In questo caso il lettore dati viene chiuso ed possibile enumerare la raccolta per caricare le entit di riferimento.

Per ulteriori informazioni, vedere Procedura: caricare in modo esplicito oggetti correlati (Entity Framework).

Definizione di un percorso della query per determinare la struttura dei risultati di query
Per specificare il percorso della query, passare una rappresentazione di stringa dell'oggetto grafico al metodo Include su ObjectQuery . Questo percorso specifica quali entit correlate restituire quando viene eseguita una query di oggetto. Un percorso della query definito in una query per gli oggetti Contact garantisce, ad esempio, che vengano restituiti tutti gli oggetti SalesOrderHeader e SalesOrderDetail correlati. Questo comportamento viene illustrato nella query seguente:
C#

/ /D e f i n eaL I N Qq u e r yw i t hap a t ht h a tr e t u r n s / /o r d e r sa n di t e m sf o rac o n t a c t . v a rc o n t a c t s=( f r o mc o n t a c ti nc o n t e x t . C o n t a c t s . I n c l u d e ( " S a l e s O r d e r H e a d e r s . S a l e s O r d e r D e t a i l s " ) s e l e c tc o n t a c t ) . F i r s t O r D e f a u l t ( ) ;

Le considerazioni seguenti riguardano la definizione dei percorsi della query: I percorsi della query possono essere utilizzati con i metodi del generatore di query e con le query LINQ. Quando si chiama Include , il percorso della query valido solo nell'istanza restituita di ObjectQuery . Le altre istanze di ObjectQuery e il contesto dell'oggetto stesso non sono interessati. Poich Include restituisce l'oggetto query, possibile chiamare questo metodo pi volte su un oggetto ObjectQuery per includere entit di pi relazioni, come nell'esempio seguente:
C#

/ /C r e a t eaS a l e s O r d e r H e a d e rq u e r yw i t ht w oq u e r yp a t h s , / /o n et h a tr e t u r n so r d e ri t e m sa n das e c o n dt h a tr e t u r n st h e / /b i l l i n ga n ds h i p p i n ga d d r e s s e sf o re a c ho r d e r . O b j e c t Q u e r y < S a l e s O r d e r H e a d e r >q u e r y= c o n t e x t . S a l e s O r d e r H e a d e r s . I n c l u d e ( " S a l e s O r d e r D e t a i l s " ) . I n c l u d e ( " A d d r e s s " ) ;

L'utilizzo di percorsi della query pu comportare l'esecuzione di comandi complessi nell'origine dati, derivanti da query di oggetto apparentemente semplici. Questo comportamento si verifica perch sono necessari uno o pi join per restituire oggetti correlati in una singola query, il che comporta la presenza di dati ridondanti per ogni entit correlata restituita dall'origine dati. Questa complessit maggiore nelle query su un modello complesso, ad esempio un'entit con ereditariet o un percorso che include relazioni molti-a-molti. Utilizzare il metodo ToTraceString per visualizzare il comando che verr generato da un oggetto ObjectQuery . Quando un percorso della query include troppi oggetti correlati o gli oggetti contengono troppi dati di riga, la query potrebbe non essere completata dall'origine dati. Questo si verifica se la query richiede un'archiviazione temporanea intermedia superiore alle possibilit dell'origine dati. In questo caso, possibile ridurre la complessit della query sull'origine dati caricando in modo esplicito gli oggetti correlati oppure abilitando il caricamento posticipato. Se dopo avere ottimizzato una query complessa si ottengono ancora timeout frequenti, aumentare il valore di timeout impostando la propriet CommandTimeout.

Per ulteriori informazioni, vedere Procedura: utilizzare percorsi di query per influenzare i risultati (Entity Framework).

Caricamento lazy di oggetti entit


Entity Framework supporta il caricamento lazy di entit correlate. Durante il runtime di Entity Framework , il valore predefinito della propriet LazyLoadingEnabled in un'istanza di un oggetto ObjectContext false . Se, tuttavia, si utilizzano gli strumenti di Entity Framework per creare un

http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx

2/4

15/4/2014

Caricamento di oggetti correlati (Entity Framework)

nuovo modello e le corrispondenti classi generate, LazyLoadingEnabled viene impostato su true nel costruttore del contesto dell'oggetto. Con la funzione di caricamento lazy abilitata, le entit correlate non vengono caricate dall'origine dati fino a quando la funzione di accesso get di una propriet di navigazione non accede a tali oggetti a livello di codice. Per disabilitare il caricamento lazy, impostare la propriet LazyLoadingEnabled su false nell'istanza di ObjectContextOptions restituita dalla propriet System.Data.Objects.ObjectContext.ContextOptions. Il caricamento lazy pu essere utilizzato insieme al caricamento eager. In questo modo, possibile definire un grafico di dati di base tramite i percorsi della query, nonch caricare entit correlate aggiuntive non incluse nei percorsi della query originali in base alle necessit. Per ulteriori informazioni, vedere Procedura: utilizzare il caricamento lazy per caricare oggetti correlati (Entity Framework). Quando si utilizza il caricamento lazy utile tenere presenti le seguenti considerazioni: Il caricamento lazy supportato per le propriet di navigazione che restituiscono sia un'entit singola, ad esempio EntityReference , che una raccolta di entit, ad esempio EntityCollection. Se il caricamento lazy abilitato ed stata gi caricata un'entit correlata, questa non verr ricaricata. Il caricamento lazy supportato per le entit che si trovano in uno stato Detached. In questo caso, gli oggetti correlati vengono restituiti anche in uno stato Detached. Il comportamento del caricamento lazy determinato dall'istanza ObjectContext utilizzata per recuperare l'oggetto dall'origine dati (anche se l'entit stata caricata con NoTrackingMergeOption) o alla quale l'oggetto stato aggiunto o allegato. Per questo motivo, non possibile modificare il comportamento del caricamento lazy una volta che il contesto stato eliminato e qualsiasi ulteriore operazione di caricamento lazy non riuscir. Per la serializzazione delle entit pu essere utile disabilitare il caricamento lazy. In caso contrario, verr attivato il caricamento lazy e l'entit serializzata potrebbe includere pi dati del previsto.

Quando si utilizza il caricamento lazy con entit POCO, esistono ulteriori considerazioni da tenere presente. Per ulteriori informazioni, vedere Caricamento di entit POCO correlate (Entity Framework).

Esecuzione di una query sugli oggetti entit correlati


La chiamata al metodo CreateSourceQuery su un oggetto EntityCollection consente di eseguire una query su oggetti correlati senza dover prima caricare oggetti nella raccolta. CreateSourceQuery restituisce un ObjectQuery che, in caso di esecuzione, restituisce lo stesso set di oggetti di quando viene chiamato il metodo Load. I metodi del generatore di query possono essere applicati a questa query di oggetto per filtrare ulteriormente gli oggetti caricati nella raccolta. Per ulteriori informazioni, vedere Procedura: eseguire una query sugli oggetti correlati in un oggetto EntityCollection (Entity Framework). Un oggetto ObjectQuery restituisce i dati di entit come entit. Quando nella proiezione della query pi esterna viene inclusa una propriet di navigazione, la query restituisce tuttavia anche le entit correlate a cui ha avuto accesso tramite la navigazione. Per ulteriori informazioni, vedere Procedura: spostarsi nelle relazioni utilizzando le propriet di navigazione (Entity Framework).

Considerazioni sulle prestazioni


Nella scelta di un modello per il caricamento di entit correlate occorre valutare il comportamento di ogni approccio considerando il numero e la durata delle connessioni effettuate all'origine dati rispetto alla quantit di dati restituita da una singola query e alla complessit dell'utilizzo di una sola query. Il caricamento eager restituisce in un'unica query tutte le entit correlate insieme alle entit sottoposte a query. Questo significa che, mentre solo una connessione aperta verso l'origine dati, viene restituita una maggiore quantit di dati nella query iniziale. Inoltre, i percorsi della query comportano una query pi complessa a causa dei join aggiuntivi richiesti nella query eseguita sull'origine dati. Il caricamento lazy esplicito consente di posticipare la richiesta dei dati degli oggetti correlati al momento in cui sono veramente necessari. In questo modo viene prodotta una query iniziale meno complessa che restituisce meno dati totali. Tuttavia, a ogni caricamento successivo di un oggetto correlato viene effettuata una connessione all'origine dati ed eseguita una query. Nel caso di caricamento lazy, questa connessione si verifica ogni volta che viene eseguito l'accesso a una propriet di navigazione e l'entit correlata non gi caricata. Se si interessati a quali entit correlate vengono restituite dalla query iniziale o alla gestione dell'intervallo di tempo richiesto per il caricamento delle entit correlate dall'origine dati, potrebbe essere utile disabilitare il caricamento lazy. Il caricamento lazy abilitato nel costruttore del contesto dell'oggetto generato da Entity Framework . Per ulteriori informazioni, vedere Considerazioni relative alle prestazioni (Entity Framework).

http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx

3/4

15/4/2014

Caricamento di oggetti correlati (Entity Framework)

Vedere anche
Concetti
Esecuzione di query su un modello concettuale (Entity Framework) Query di oggetto (Entity Framework) Metodi del generatore di query (Entity Framework)

Il documento risultato utile?

No

Aggiunte alla community


2014 Microsoft. Tutti i diritti riservati.

http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx

4/4