Profundo entendimento do carregamento lento e do descarte de erros no MVC .net
Eu estava tentando escrever uma resposta completa e detalhada para a seguinte pergunta:Por que "Dispose" funciona, e não "using (var db = new DataContext ())"?
então montei meu projeto que inclui:
Departamentos e funcionários usando a estrutura da entidade
então meu método de ação foi o seguinte:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments;
}
return View(d);
}
é natural esperar que isso resulte no erro comum:
The operation cannot be completed because the DbContext has been disposed
e quando quis resolvê-lo, fiz o seguinte [para forçar o carregamento mais rápido do que o fácil]:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments.toList();
}
return View(d);
}
então eu estava tentando entender as coisas sob o capô e observei o tipo de retorno do método View (). e cheguei ao seguinte 'Corrigir' premissas:
1 - o modelo [d] é chamado de forma lenta de carregamento dentro da instrução using.
2- portanto, quando o modelo [d] é enviado à visualização para gerar a página, o DbContext já está disposto pelo último colchete da instrução using.
3- resolvemos essa situação enviando o modelo [d] para a vista com um estilo de carregamento ansioso.
então continuei minhas suposições que provaram ser 'errado' como segue:
4- como o método View () está retornando o objeto ViewResult, que também é um ActionResult. Em seguida, posso gerar esse objeto dentro da instrução using e devolvê-lo ao usuário.
então eu fiz o seguinte:
public ActionResult Index()
{
ActionResult myView;
using (var ctx = new ApplicationDbContext())
{
IEnumerable<department> d = ctx.departments;
myView = View(d);
}
return myView;
}
então eu disse a mim mesmo agora que quando o executo, o objeto ViewResult [myView] já será criado e será retornado ao usuário e nenhum erro será encontrado.
No entanto, fiquei surpreso que o mesmo erro ocorreu:
The operation cannot be completed because the DbContext has been disposed
Fiquei surpreso como esse carregamento preguiçoso é realmente preguiçoso e carrega apenas no último momento.
Então eu continuei meu 'errado'suposições da seguinte forma:
5- pode ser necessário forçar o método View () para calcular o resultado dentro da instrução using. então eu usei o métodoExecuteResult(ControllerContext)
.
e agora pensei em executar o método de ação sem nenhum erro, mas novamente ocorreu o mesmo erro:
The operation cannot be completed because the DbContext has been disposed.
Então, minha pergunta agora é:
onde na estrutura do MVC ocorre a execução de consultas de carregamento lento !!
ou deixe-me reformular minha pergunta da seguinte maneira:
PorqueView(d)
O método itera sobre o objeto [d] quando está fora da declaração de uso, e não quando o método view (d) está dentro da Instrução using.
Eu só preciso entender por que minhas suposições estavam erradas.