Comprensión profunda del error de carga y eliminación lenta en MVC .net
Estaba tratando de escribir una respuesta detallada completa a la siguiente pregunta:¿Por qué funciona "Eliminar" y no "usar (var db = new DataContext ())"?
así que configuré mi proyecto que incluye:
Departamentos y empleados que utilizan el marco de la entidad.
entonces mi método de acción fue este:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments;
}
return View(d);
}
Es natural esperar que esto resulte en un error común:
The operation cannot be completed because the DbContext has been disposed
y cuando quise resolverlo hice lo siguiente [para forzar una carga ansiosa en lugar de una carga fácil]:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments.toList();
}
return View(d);
}
Así que estaba tratando de entender las cosas debajo del capó y miré el tipo de retorno del método View (). y llegué a la siguiente 'Correcto'supuestos:
1- el modelo [d] se llama en forma de carga diferida dentro de la instrucción de uso.
2- entonces cuando el modelo [d] se envía a la vista para generar la página, el DbContext ya está dispuesto por el último corchete de la instrucción using.
3- resolvemos esta situación enviando el modelo [d] a la vista con ansiosa carga.
luego continué mis suposiciones que resultaron ser 'incorrecto'de la siguiente manera:
4- dado que el método View () está devolviendo el objeto ViewResult, que también es un ActionResult ... entonces puedo generar este objeto dentro de la instrucción using y luego devolverlo al usuario.
entonces hice lo siguiente:
public ActionResult Index()
{
ActionResult myView;
using (var ctx = new ApplicationDbContext())
{
IEnumerable<department> d = ctx.departments;
myView = View(d);
}
return myView;
}
así que me dije a mí mismo ahora cuando lo ejecuto, el objeto ViewResult [myView] ya estará creado y será devuelto al usuario y no se encontrará ningún error.
Sin embargo, me sorprendió que ocurriera el mismo error:
The operation cannot be completed because the DbContext has been disposed
Me sorprendió cómo esta carga perezosa es realmente perezosa y se carga solo en el último momento.
Entonces continué mi 'incorrecto'supuestos de la siguiente manera:
5- puede ser que necesite forzar el método View () para ejecutar el resultado dentro de la instrucción using. así que usé el métodoExecuteResult(ControllerContext)
.
y ahora pensé que podía ejecutar el método de acción sin ningún error, pero nuevamente ocurrió el mismo error:
The operation cannot be completed because the DbContext has been disposed.
Entonces mi pregunta ahora es:
donde en el marco de MVC se produce la consulta de excución de carga diferida !!
o déjame reformular mi pregunta de la siguiente manera:
Por quéView(d)
el método itera sobre el objeto [d] cuando está fuera del estado de uso, y no cuando el método view (d) está dentro de la Declaración de uso.
Solo necesito entender por qué mis suposiciones estaban equivocadas. Gracias de antemano