2012-04-11 24 views
9

Tengo una consulta específica en mi código que necesita la carga ansiosa todas las entidades relacionadas (ambos -> 1 FKs y -> N FKs) porque el contexto estará dispuesto justo después de eso .Código EF Primera: no incluyen el trabajo en relación opcional

hice un método genérico "consulta" que se lleva a params Expression<Func<MyItem, object>>[] includes y luego les internamente cadenas. Esa parte funciona bien.

La consulta se parece a esto:

var item = facade.Query<MyItem>(
       c => c.Childs.Select(x => x.Parent), 
       c => c.Childs.Select(x => x.SubChild1), 
       c => c.Childs.Select(x => x.SubChildNotWorking), 
       c => c.Childs.Select(x => x.SubChild2), 
       c => c.Childs.Select(x => x.SubChild3), 
       c => c.Childs.Select(x => x.SubChildrens) 
       ).FirstOrDefault(c => c.Name == name); 

El mapeo de la propiedad que no trabaja (que se encuentra en la configuración de SubChildNotWorking):

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey); 

De todos los incluye, sólo el SubChildNotWorking doesn' en realidad funciona Al inspeccionar con el depurador el objeto devuelto, veo los proxies en todas las propiedades. Abrir los proxies me da los datos correctos para todas las demás relaciones, y un "El objetocontexto ya ha sido eliminado" para la propiedad SubChildNotWorking.

La única diferencia que era capaz de detectar es que el SubChildNotWorking es una FK anulable (con columna anulable de la configuración DB y WithOptional en el dbcontext), mientras que todos los demás son FKs no anulables configurados con WithRequired.

La base de datos también es un legado DB no se ha creado con el Código de Primera y no siguiendo sus convenciones, acabo de hacer las asignaciones en el DbContext. Todo lo demás funciona bien

estoy tratando de averiguar si la carga ansiosa no funciona en FKs anulables pero no pude encontrar ninguna documentación al respecto.

¿Eso es un error o un comportamiento intencionado? Pero, sobre todo, ¿cómo resuelvo esto?

Gracias.

+0

¿Qué pasa si se incluye sólo el 'SubChildNotWorking' sin los otros subchildren? ¿Funciona entonces? – Slauma

+0

No. Tampoco funciona –

+1

Se puede comprobar si el SQL es correcta (con sql var = facade.Query (c => c.Childs.Select (x => x.SubChildNotWorking)) ToString();. ') Y probar la consulta manualmente SSMS si devuelve las filas de resultados esperados. – Slauma

Respuesta

0

¿Ha definido

[DataContract] 

en su clase (entidades)? Si es así, no se olvide de anotar su SubChild con

[DataMember] 

o podría terminar cargado pero no aparecen cuando se realiza la llamada GET sobre las entidades.

0

Cuando se trabaja con el método de incluir, que está hablando el patrón de carga ansiosa. Las entidades con relación se cargarán como colecciones. Para cualquier clave externa no anulable, hay una colección trivial que comienza vacía, pero para las que aceptan nulos, no existe. En Code First, puede hacer que la propiedad de navegación sea virtual, pero no es su caso. Usted puede tratar de cargarlo directamente en Contexto, por ejemplo:

var someEntity = context.someEntities.Find(1); 
context.Entry(someEntity).Reference(e => e.EntityWithFKNullable).Load(); 

o la versión más corta:

context.EntitiesWithFKNullable.Load(); 
Cuestiones relacionadas