Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Porque populou os produtos?

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?

2 respostas
solução!

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.