2009-06-23 13 views
7

En ADO.Net Entity Framework, tengo un objeto que tiene 4 referencias a otros objetos. Por alguna razón, cuando consulto esas referencias, dos de ellas se cargan automáticamente (como se esperaba) y dos de ellas siempre devuelven nulo.Referencias de Entity Framework que no se cargan automáticamente

Extrañamente, cuando yo manualmente piden las referencias para cargar, cargan solo dandy.

A modo de ejemplo:

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

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

La primera vez que comprobar el HoldingEntity siempre es nula, sin embargo, la carga devolverá el HoldingEntity sin problema.

¿Alguna pista?

Gracias!

Respuesta

7

utilización de las entidades de ADO.NET, es necesario que especifique qué entidades que desea cargar de forma automática con Include, como en

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

perfecto, que resolvió que, gracias! Supongo que lo que todavía no entiendo es, ¿por qué dos de las referencias se cargan automáticamente, y dos de ellas no? – gerrod

+0

Eso no es del todo cierto (al menos a partir de EF 4, nunca he trabajado con EF 1). PUEDE especificar qué referencias desea cargar automáticamente (e inmediatamente), pero también puede confiar en la carga diferida para cargar según sea necesario. Sin embargo, la carga diferida parece estar rota incluso en EF 4, por lo que esta es probablemente la respuesta correcta desde una perspectiva práctica. Ver http://msdn.microsoft.com/en-us/library/bb896272.aspx –

0

Esto se hizo en EF v1 como una decisión de diseño, y de hecho muchos desarrolladores prefieren tener control explícito sobre si y cuando se cargarán las propiedades referenciadas

Para que EF v4 salga con .NET 4.0 antes de finales de 2009, tendrá la opción de activar la carga automática diferida, si así lo desea. Consulte this blog post en el blog del equipo ADO.NET para obtener más información sobre la carga diferida en EF v4.

Marc

+0

Eso es cierto, Marc, pero el problema con la carga diferida es que hay muchas consultas en la base de datos y se deben usar con prudencia. Dependiendo de lo que uno necesite, es fácil precargar las entidades. –

5

Como otros han dicho que necesita para .Include() en V1 a evitar la necesidad de llamar a .Load()

En 4.0 usted será capaz de establecer DeferredLoadingEnable d en su ObjectContext (creo que estamos cambiando el nombre al más apropiado LazyLoadingEnabled a tiempo para Beta2).

En cuanto a por qué obtiene 2 relaciones ya cargadas de todos modos. Ese es probablemente un efecto secundario de algo llamado Reparación de relaciones.

Cuando dos entidades relacionadas se encuentran en el mismo contexto, automáticamente sus relaciones se fijan entre sí. Entonces, si (como sospecho) 2 de las 4 entidades ya están en su contexto, cuando realiza la consulta, terminará en una situación en la que se cargan 2 de sus relaciones, aunque no haya llamado al .Include() o al .Load().

Esperanza esto ayuda

Saludos Alex

+0

¡Ah! Gracias por eso, tiene perfecto sentido. – gerrod

+0

¿Cómo se arreglan las relaciones automáticamente y existe alguna forma de desactivarlo? Esto está causando algunos efectos secundarios graves para mí porque está rellenando objetos. ¡Gracias! – strongriley

Cuestiones relacionadas