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

ProdutoID não está sendo inserido na tabela da vendas

Quando rodo o código escriturado por essa página,

EntidadesContext ctx = new EntidadesContext();
Venda venda = ctx.Vendas.Include(v => v.ProdutosVenda).ThenInclude(pv => pv.Produto).FirstOrDefault(v => v.ID == 1);

foreach(var pv in venda.ProdutosVenda) {
    Console.WriteLine(pv.Produto.Nome);
}

ctx.Dispose();
Console.ReadLine();

teoricamente eu deveria inserir todos os valores na tabela de venda. No entanto, apenas os valores para o ID da venda e o ID do cliente são inseridos, deixando de inserir o ID do produto. Como que eu faço para que com este código insira também o ID do produto?

6 respostas

Olá Rafael,

se entendi bem a sua dúvida, o problema na verdade está no momento em que você vai cadastrar as informações, é isso? Como que ficou o código que cadastrou o Produto?

Olá, Lucas.

Na verdade, acho que não é isso. O problema está no momento que quero relacionar as informações do produto com o cadastro da venda. Segundo a lógica do curso, seu sistema vai ter uns produtos que podem ser vendidos, certo? No sistema, também consta quais são os usuários (clientes) que estarão comprando o produto. E aí, quando você aciona o mecanismo de venda, esse sistema deveria registrar que o ID da venda, o ID do cliente que realizou a compra, bem como o ID do produto que foi comprado. No LINQ utilizado no exercício, de alguma forma ele consegue pegar o ID do cliente e registrar, mas não faz o mesmo para o ID do produto. A real é que não entendi bem como funcionou esse LINQ.

De qualquer forma, aqui está o código de cadastramento de um produto:

Produto p = new Produto()
{
    Nome = "Mouse",
    Preco = 20,
    Categoria = c
};

O ID dele não é um variável que deve ser informada, mas sim algo que é gerado automaticamente, com base na quantidade de produtos já inseridos do DB.

A tabela de vendas, no momento, se encontra assim. A tabela de produtos, no momento, se encontra assim. A tabela que relaciona a venda com um produto (ProdutoVenda), está assim.

O código utilizado para gerar a venda é:

EntidadesContext contexto = new EntidadesContext();
            UsuarioDAO dao = new UsuarioDAO();
            Usuario renan = dao.BuscaPorId(1);

            Venda v = new Venda()
            {
                Cliente = renan
            };

            Produto p = contexto.Produtos.FirstOrDefault(prod => prod.ID == 1);
            Produto p2 = contexto.Produtos.FirstOrDefault(prod => prod.ID == 2);

            ProdutoVenda pv = new ProdutoVenda()
            {
                Venda = v,
                Produto = p
            };

            ProdutoVenda pv2 = new ProdutoVenda()
            {
                Venda = v,
                Produto = p2
            };

            contexto.Vendas.Add(v);
            contexto.ProdutoVenda.Add(pv);
            contexto.ProdutoVenda.Add(pv2);

            contexto.SaveChanges();
            Console.ReadLine();

Desculpa a explicação gigante, mas acho que agora cobri quase tudo que tinha para explicar a questão.

solução!

Olá Rafael,

então ele faz o registro do produto e quem é resposável por isso é a classe ProdutoVenda.

A classe Venda do curso ficou assim:

public class Venda
{
    public virtual Usuario Cliente { get; set; }
    public int ClienteID { get; set; }

    public IList<ProdutoVenda> ProdutosVenda { get; set; }
}

Ou seja, uma Venda possui 1 Cliente que fez a compra e uma lista de vários produtos que foram comprados nesta venda (a IList de ProdutoVenda).

Já a classe ProdutoVenda está assim:

public class ProdutoVenda
{
      public int VendaID { get; set; }
      public virtual Venda Venda { get; set; }
      public int ProdutoID { get; set; }
      public virtual Produto Produto { get; set; }
}

Ou seja, um ProdutoVenda associa 1 Venda e 1 Produto, é meio que a tabela intermediária do relacionamento many to many.

O LINQ da consulta já tinha ficado assim:

Venda venda = ctx.Vendas.Include(v => v.ProdutosVenda).ThenInclude(pv => pv.Produto).FirstOrDefault(v => v.ID == 1);

O que ele está fazendo é justamente a partir de todas as Vendas ( ctx.Vendas ), ele quer pegar a venda que tem id 1 ( FirstOrDefault(v => v.ID == 1) ). Mas ele não quer apenas os dados específicos da venda 1, o LINQ tem que recupera junto a sua lista dos produtos vendidos ( Include(v => v.ProdutosVenda) ), mas eu quero a informação isolada de cada produto também, como o nome e id ( ThenInclude(pv => pv.Produto) ).

Até por isso o código depois do LINQ

foreach(var pv in venda.ProdutosVenda) {
    Console.WriteLine(pv.Produto.Nome);
}

faz basicamente uma varredura de todos os produtos desta venda, mostrando o nome de cada um. Se queria pegar o id, era só trocar o Console.WriteLine(pv.Produto.Nome) por Console.WriteLine(pv.Produto.Id)

Entendi! Agora uma dúvida mais besta, como eu, ao invés de imprimir o valor do ID do produto, inseriria o valor ProdutoID na tabela de vendas?

Pqp, seria na hora de declarar a venda, mosquei agora hahahahah, perdão

Valeu muito mano