2012-10-02 21 views
7

Medio AmbienteEF/LINQ Como incluir entidades secundarias cuando existe una relación bidireccional

estoy usando Entity Framework 5 en Framework 4.0. (Esto significa que estoy usando EF 4.4). Como entidades, utilizo STE (Self Tracking Entities) porque estoy trabajando en una aplicación N-Tier. Utilizamos un enfoque basado en bases de datos porque EF se introdujo más adelante en el juego.

Contexto

tengo 2 Entidades que ambos tienen una propiedad de navegación entre sí. (EntityA tiene una propiedad de navegación para EntityB, y EntityB one para EntityA). La relación es 'EntityA> One-TO-Many> EntityB'. Cuando quiero cargar las entidades secundarias a través de una expresión LINQ, necesito usar INCLUDE (STE => Eager Loading) porque pasaré todos los datos a través de varios niveles.

El código

Aquí está mi código para llamar a sus hijos EntityA con EntityB.

using (var ctx = new MyEntities()) 
{ 
    var result = (from s in ctx.EntityA.Include("EntityB") 
        where s.Id = 11111 
        orderby s.TimeUpdated descending 
        select s) 
       .Take(10) 
       .ToList(); 
    return result; 
} 

El error

System.StackOverflowException {No se puede evaluar la expresión porque el hilo actual está en un estado de desbordamiento de pila.}

No hay error cuando quito el 'INCLUDE'. Supongo que el motivo es sencillo. Quiero cargar EntityA con registros hijo EntityB, los registros EntityB quieren cargar su EntityA padre cada vez, y EntityA ... Supongo que todos entienden el ciclo infinito aquí.

Mis soluciones o alternativas

  • voy a mi archivo EDMX y quitar la propiedad de navegación para EntityA en EntityB. Si ahora quiero cargar datos sobre EntityA mientras tengo una EntityB a mi disposición. Necesito hacer una solicitud de DB por separado y tengo 2 objetos diferentes que tengo que pasar a través de mis niveles.
  • Evite el uso de incluir, cargue por separado el EntityA y empújelo en la propiedad de navegación de mi EntityB que se refiere a mi EntityA.

la cuestión

¿Hay alternativas mejores o enfoques para solucionar este problema en mi situación? ¿Debo continuar con una de mis alternativas que propuse o no? Porque esperaba una solución mejor y más limpia.

I Gracias por su tiempo

Ian

+1

1 Para una (primera) pregunta muy bueno para usted. –

+0

Intenté reproducir su problema en EF 5 (Visual Studio 2012) y no obtuve ningún error. ¿Hay algo más que pueda causar tu problema? ¿Está funcionando con una configuración simple de POCO? (Nota anterior ... He trabajado anteriormente con STE y ahora realmente estoy tratando de evitarlos. ¿Estás seguro de que deseas utilizar STE?) –

+0

No puedo reproducir el error tampoco (EF5, .NET 4.0). ¿Es posible publicar el stacktrace y quizás borrar los datos confidenciales? –

Respuesta

1

He intentado reproducir su problema en EF 5 (Visual Studio 2012) y no recibo ningún error. ¿Hay algo más que pueda causar tu problema? ¿Está funcionando con una configuración simple de POCO?

También quería señalar que los STE pueden causarle bastante dolor de cabeza. He trabajado con STE antes y ahora estoy tratando de evitarlos. ¿Estás seguro de que quieres usar STE?

En lugar de utilizar STE, puede usar DTO antiguos simples. Conservará su modelo de dominio enriquecido en el servidor y solo enviará los datos que sean necesarios para el cliente. De esta forma, puede crear DTO adaptadas con la menor cantidad de datos para cada caso de uso.

0

Vine aquí a decir a usted "Puede utilizar Include" pero es obvio que no le ayuda en esta situación.

Como he leído en Internet por lo general, hay algunas soluciones alternativas cuando sospechamos (o tienen) un caso bucle infinito:

  1. Podemos utilizar Load operaciones mediante el uso de foreach y cargar a los niños de forma manual.
  2. Podemos crear una base de datos view that is a recursive query por sí mismo (y usar su entidad).
+0

- 1. Las operaciones de carga no se pueden aplicar porque mis propiedades de navegación no son _EntityCollections _ pero _TrackableCollection _ - 2. Tristemente, esto no se aplica a mi contexto. Por ejemplo, quiero acceder fácilmente a la Entidad Principal (EntityA) y guardarla como un campo de mi EntityB. He probado 'context.LoadProperty (EntityB, "EntityA")' Pero también genera la misma StackOverflowException. Gracias por los consejos –

0

see this

Sin embargo, he instalado la actualización 4 y todavía no puede depurar

Cuestiones relacionadas