Tenía en mi repository este método:
public IEnumerable Lista()
{
return context.Estudiante
.OrderBy(o => o.ApellidoPaterno);
}
Y luego desde un controller llamaba este método así:
var estudiantes= repositorioEstudiante.Lista();
Más adelante tenía una línea donde solicitaba esta propiedad: estudiante.Campus
Como la tabla “Estudiante” tiene una relación de uno a muchos con la tabla “Campus” (un campus tiene muchos estudiantes, y un estudiante pertenece únicamente a un campus), entonces al solicitar esa propiedad aparecía este error:
There is already an open DataReader associated with this Command which must be closed first.
Esto ocurre porque debido a lazy loading el método Lista tiene todos los elementos del estudiante, pero no el del campus relacionado. Cuando intentas llamar la propiedad estudiante.Campus se intenta hacer una nueva conexión y por eso ocurre el error.
Para solucionarlo, debes indicar al método Lista que incluya de una vez todos los registros relacionados de campus.
Se hace así:
public IEnumerable Lista()
{
return context.Estudiante
.OrderBy(o => o.ApellidoPaterno)
.Include(e => e.Campus);
}
De esta forma estás haciendo Eager Loading, lo cual genera una sentencia join en la base de datos que carga de una vez todos los registros. Al solicitar la propiedad estudiante.Campus entonces no estás haciendo otra conexión nueva, y desaparece el error.
Para aprender más sobre los tipos de carga que existen checa esta página en la parte donde dice “Lazy, Eager, and Explicit Loading of Related Data”.
Otra solución al problema es activar MARS, pero prefiero la que te puse en este artículo.