caricamento di oggetti correlati (entity framework)
DESCRIPTION
Caricamento Di Oggetti Correlati (Entity Framework)TRANSCRIPT
-
15/4/2014 Caricamento di oggetti correlati (Entity Framework)
http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx 1/4
Utilizzando il sito si accetta luso di cookies per analisi, risultati personalizzati e pubblicit. Ulteriori informazioni
Caricamento di oggetti correlati (Entity Framework)
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).
Nei modelli seguenti vengono descritte la modalit di caricamento delle entit correlate:
Modello di
caricamentoDescrizione
Specificato
nella query
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.
.NET Framework 4 Questo argomento non stato ancora valutato
-
15/4/2014 Caricamento di oggetti correlati (Entity Framework)
http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx 2/4
Nota:
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:
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:
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
// Define a LINQ query with a path that returns
// orders and items for a contact.
var contacts = (from contact in context.Contacts
.Include("SalesOrderHeaders.SalesOrderDetails")
select contact).FirstOrDefault();
// Create a SalesOrderHeader query with two query paths,
// one that returns order items and a second that returns the
// billing and shipping addresses for each order.
ObjectQuery query =
context.SalesOrderHeaders.Include("SalesOrderDetails").Include("Address");
C#
C#
-
15/4/2014 Caricamento di oggetti correlati (Entity Framework)
http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx 3/4
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).
-
15/4/2014 Caricamento di oggetti correlati (Entity Framework)
http://msdn.microsoft.com/it-it/library/vstudio/bb896272(v=vs.100).aspx 4/4
Il documento risultato utile?
Aggiunte alla community
Vedere anche
ConcettiEsecuzione di query su un modello concettuale (Entity Framework)
Query di oggetto (Entity Framework)
Metodi del generatore di query (Entity Framework)
2014 Microsoft. Tutti i diritti riservati.
S No