2009-06-23 3 views
7

In ADO.Net Entity Framework, ho un oggetto che ha 4 riferimenti ad altri oggetti. Per qualche ragione, quando interrogo quei riferimenti, due di essi si caricano automaticamente (come previsto) e due di essi restituiscono sempre null.Riferimenti di Entity Framework che non vengono caricati automaticamente

Stranamente, quando I manualmente chiedere i riferimenti per caricare, caricano solo dandy.

Ad esempio:

if (account.HoldingEntity == null && 
    account.HoldingEntityReference.EntityKey != null) { 

    account.HoldingEntityReference.Load(); 
    account.HoldingEntity = account.HoldingEntityReference.Value; 
} 

Quando ho controllare il HoldingEntity è sempre nullo, ma il carico restituirà la HoldingEntity senza problemi.

Eventuali indizi?

Grazie!

risposta

7

Utilizzando entità ADO.NET, è necessario specificare quali entità che si desidera caricare automaticamente Include, come in

Dim entity = (From e in db.Entities.Include("SubEntity")) 
+0

Perfetto, che risolto, grazie! Immagino che cosa ancora non capisco, però, perché due dei riferimenti si caricano automaticamente e due di essi no? – gerrod

+0

Non è del tutto vero (almeno a partire da EF 4, non ho mai lavorato con EF 1). È possibile specificare quali riferimenti si desidera caricare automaticamente (e immediatamente), ma si può anche fare affidamento sul caricamento lento per caricare secondo necessità. Tuttavia, il caricamento lento sembra rotto anche in EF 4, quindi questa è probabilmente la risposta corretta da una prospettiva pratica. Vedi http://msdn.microsoft.com/en-us/library/bb896272.aspx –

0

Ciò è stato fatto in EF v1 come una decisione di progettazione, e molti sviluppatori in realtà preferiscono avere controllo esplicito su se e quando verranno caricate le proprietà referenziate.

Per EF v4 che esce con .NET 4.0 prima della fine del 2009, è possibile attivare il caricamento differito automatico, se lo si desidera. Vedere this blog post sul blog del team di ADO.NET per ulteriori informazioni sul caricamento differito in EF v4.

Marc

+0

Questo è vero, Marc, ma il problema con il caricamento differito è che ci sono molte query sul database e dovrebbero essere usate con saggezza. A seconda delle esigenze, è semplice precaricare le entità. –

5

Come altri hanno detto che devi .Include() in v1 per evitare di dover chiamare .Load()

In 4.0 si sarà in grado di impostare DeferredLoadingEnable d sul ObjectContext (penso che stiamo cambiando questo nome al più appropriato LazyLoadingEnabled in tempo per Beta2).

Per quanto riguarda il motivo per cui si ottengono 2 relazioni già caricate comunque. Questo è probabilmente un effetto collaterale di qualcosa chiamato Relationship Fix-up.

Quando due entità correlate si trovano nello stesso contesto, ottengono automaticamente che la loro relazione sia fissata l'una all'altra. Quindi se (come sospetto) 2 delle 4 entità sono già nel tuo contesto, quando esegui la query, finirai in una situazione in cui vengono caricate 2 delle tue relazioni, anche se non hai chiamato .Include() o .Load().

Spero che questo aiuti

Acclamazioni Alex

+0

Ah! Grazie per questo, ha perfettamente senso. – gerrod

+0

Come vengono riparate automaticamente le relazioni e c'è un modo per disabilitare questo? Questo sta causando alcuni gravi effetti collaterali per me perché si tratta di oggetti di riempimento. Grazie! – strongriley