Na Action GetCarrinhoViewModel, se a lista de produtos for omitida, os produtos do GetItensPedido vem nulos, mas eles são duas listas distintas. Como isso funciona internamente no framework?
Na Action GetCarrinhoViewModel, se a lista de produtos for omitida, os produtos do GetItensPedido vem nulos, mas eles são duas listas distintas. Como isso funciona internamente no framework?
Olá, David
Entendi o que você disse. Sua pergunta é uma das mais interessantes que já vi no fórum. Pelo que disse, você removeu a linha do GetProdutos()
:
private CarrinhoViewModel GetCarrinhoViewModel()
{
//List<Produto> produtos =
// this._dataService.GetProdutos();
var itensCarrinho = this._dataService.GetItensPedido();
CarrinhoViewModel viewModel =
new CarrinhoViewModel(itensCarrinho);
return viewModel;
}
Ao fazer isso, o programa para de funcionar, por causa do erro no Razor ao tentar exibir a linha da view:
NullReferenceException: Object reference not set to an instance of an object.
AspNetCore._Views_Pedido_Carrinho_cshtml+<ExecuteAsync>d__29.MoveNext() in Carrinho.cshtml
<div class="col-md-3">@item.Produto.Nome</div>
O problema é que os produtos não foram populados. Mas quando consultamos o GetProdutos()
, o Entity Framework curiosamente manteve um cache dos produtos! Por isso não deu erro quando chamamos GetProdutos()
antes.
Mas se você quiser remover GetProdutos()
(que é o correto), então precisa fazer uma modificação no método GetItensPedido()
classe DataService
para incluir os produtos na consulta aos itens de pedido:
using Microsoft.EntityFrameworkCore;
.
.
.
public List<ItemPedido> GetItensPedido()
{
return this._contexto.ItensPedido.Include(i => i.Produto).ToList();
}
O método Include()
acima faz parte da classe EntityFrameworkQueryableExtensions
do namespace Microsoft.EntityFrameworkCore
e faz com que a consulta SQL resultante crie um JOIN
da tabela de itens de pedido com a tabela de produtos.
Eu trabalho muito com o Include() no meu dia a dia, mas ainda não utilizo o MVC CORE no meu trabalho e fiquei curioso com o que havia acontecido. Muito obrigado pela explicação.