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 Para una (primera) pregunta muy bueno para usted. –
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?) –
No puedo reproducir el error tampoco (EF5, .NET 4.0). ¿Es posible publicar el stacktrace y quizás borrar los datos confidenciales? –