none
Alterar categoria de produto com EntityFramework 6 RRS feed

  • Pergunta

  • Boa noite a todos,

    Estou tendo problemas no meu código na hora de alterar a categoria de um produto, quando vou editar o nome, o método funciona perfeitamente, mas ao tentar trocar a categora não funciona. Onde estou errando?

    Segue meu código abaixo:

      public class DBProduto : DbContext
        {
            public DBProduto() : base(@"Data Source=SERVIDOR;Initial Catalog=DBProduto;Integrated Security=SSPI") { }
            public DbSet<Produto> Produtos { get; set; }
            public DbSet<Categoria> Categorias { get; set; }
        }

        [Table("Categorias")]
        public class Categoria
        {
            //[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public int Id { get; set; }
            public string Descricao { get; set; }
            public virtual IEnumerable<Produto> Produtos { get; set; }
        }

        class CategoriaAplicacao
        {
            public DBProduto db { get; set; }

            public CategoriaAplicacao()
            {
                db = new DBProduto();
            }

            public IEnumerable<Categoria> ListarTodos()
            {
                return db.Categorias.ToList();
            }

            public Categoria ListarItem(int id)
            {
                return db.Categorias.Find(id);
            }
        }

        [Table("Produtos")]
        public class Produto
        {
            public int Id { get; set; }
            public string Nome { get; set; }
            public Categoria Categoria { get; set; }
        }

        class ProdutoAplicacao
        {

            public DBProduto db { get; set; }

            public ProdutoAplicacao()
            {
                db = new DBProduto();
            }

            public void Salvar(Produto produto)
            {
                produto.Categoria = db.Categorias.Find(produto.Categoria.Id);
                db.Produtos.Add(produto);
                db.SaveChanges();
            }

            public void Editar(Produto produto)
            {
                produto.Categoria = db.Categorias.Find(produto.Categoria.Id);
                db.Entry(produto).State = EntityState.Modified;
                db.SaveChanges();
            }

            public void Excluir(int id)
            {
                Produto produto = db.Produtos.Find(id);
                db.Produtos.Remove(produto);
                db.SaveChanges();
            }

            public IEnumerable<Produto> ListarTodos()
            {
                //return db.Produtos.ToList();
                return db.Produtos.Include(p => p.Categoria).ToList();
            }

            public Produto ListarItem(int id)
            {
                return db.Produtos.Find(id);            
            }
        }

    Nessa parte onde se encontra o erro. Quero alterar a categoria do produto que atualmente é 1 para o número 5. Mas apenas só posso mudar o nome do produto e não o código da categoria também.

                CategoriaAplicacao apCategoria = new CategoriaAplicacao();
                ProdutoAplicacao apProduto = new ProdutoAplicacao();

                // Editar
                Produto produto = new Produto
                {
                    Id = 7,
                    Nome = "Sorvete",
                    Categoria = apCategoria.ListarItem(5)
                };
                apProduto.Editar(produto);


    • Editado LWMN terça-feira, 11 de agosto de 2015 00:44
    terça-feira, 11 de agosto de 2015 00:40

Respostas

  • Olá WMN8,

     alguma novidade ? Pq não faz assim para testar :

    // Executa o método Editar
    
        var cat = apCategoria.ListarItem(5);
    
    if(cat != null)
    {  
    
        Produto produto = new Produto
        {
             Id = 7,
             Nome = "Sorvete",
             Categoria = cat
         };
         apProduto.Editar(produto);
    }
     Veja se entra no método editar ! Voltando a minha questão qual campo se relaciona entre um Produto e uma Categoria ?

    • Marcado como Resposta Marcos SJ sexta-feira, 21 de agosto de 2015 20:06
    segunda-feira, 17 de agosto de 2015 18:45

Todas as Respostas

  • Olá,

     pode ser relacionamento, qual o erro gerado ?

    terça-feira, 11 de agosto de 2015 12:33
  • Olá,

     pode ser relacionamento, qual o erro gerado ?

    Oi Daniel, na tabela Produto, eu consigo alterar o nome do produto, mas não consigo alterar a categoria dele passando o valor 5 para corresponder a outra categoria que está gravada na tabela Categoria com o valor 5. Só estou com problemas nesse campo, ele não grava.
    terça-feira, 11 de agosto de 2015 15:35
  • Olá,

     qual campo que relaciona a categoria com o produto ? Como fez esse relacionamento no Code First poste para poder lhe ajudar, caso gera algum erro informe o erro também, ou simplesmente não altera ?

    quarta-feira, 12 de agosto de 2015 12:23
  • O Campo Categoria da entidade Produto precisa de uma palavra reservada "virtual".

        [Table("Produtos")]
        public class Produto
        {
            public int Id { get; set; }
            public string Nome { get; set; }
            public virtual Categoria Categoria { get; set; }
        }

    Se você realmente está tentando editar, sugiro você mudar para o exemplo abaixo, porque da forma que está acredito que vai dar erro.

    Nessa parte onde se encontra o erro. Quero alterar a categoria do produto que atualmente é 1 para o número 5. Mas apenas só posso mudar o nome do produto e não o código da categoria também.

                CategoriaAplicacao apCategoria = new CategoriaAplicacao();
                ProdutoAplicacao apProduto = new ProdutoAplicacao();

                // Editar

            Produto produto = apProduto.ListarItem(7);      produto = Categoria = apCategoria.ListarItem(5);
                

                apProduto.Editar(produto);

    //Esse metodo seu está errado, existe a possibilidade de o campo Categoria vim com o valor Null, então vai dar erro e provavelmente é isso que está acontecendo, comenta ele

       public void Editar(Produto produto)
            {
                //produto.Categoria = db.Categorias.Find(produto.Categoria.Id);
                db.Entry(produto).State = EntityState.Modified;
                db.SaveChanges();
            }

    quarta-feira, 12 de agosto de 2015 14:20
  • O Campo Categoria da entidade Produto precisa de uma palavra reservada "virtual".

        [Table("Produtos")]
        public class Produto
        {
            public int Id { get; set; }
            public string Nome { get; set; }
            public virtual Categoria Categoria { get; set; }
        }

    Se você realmente está tentando editar, sugiro você mudar para o exemplo abaixo, porque da forma que está acredito que vai dar erro.

    Nessa parte onde se encontra o erro. Quero alterar a categoria do produto que atualmente é 1 para o número 5. Mas apenas só posso mudar o nome do produto e não o código da categoria também.

                CategoriaAplicacao apCategoria = new CategoriaAplicacao();
                ProdutoAplicacao apProduto = new ProdutoAplicacao();

                // Editar

            Produto produto = apProduto.ListarItem(7);     produto = Categoria = apCategoria.ListarItem(5);
                

                apProduto.Editar(produto);

    //Esse metodo seu está errado, existe a possibilidade de o campo Categoria vim com o valor Null, então vai dar erro e provavelmente é isso que está acontecendo, comenta ele

       public void Editar(Produto produto)
            {
                //produto.Categoria = db.Categorias.Find(produto.Categoria.Id);
                db.Entry(produto).State = EntityState.Modified;
                db.SaveChanges();
            }

    Cesar, continua sem alterar na base de dados. Não sei se entendi muito bem sua explicação. Mudei da seguinte forma:

        [Table("Produtos")]
        public class Produto
        {
            public int Id { get; set; }
            public string Nome { get; set; }
            public virtual Categoria Categoria { get; set; }
            public virtual ICollection<ListaDeProduto> ListaDeProdutos { get; set; }
        }

        class ProdutoAplicacao
        {

            public DBProduto db { get; set; }

            public ProdutoAplicacao()
            {
                db = new DBProduto();
            }

            public void Editar(Produto produto)
           {
                 //var item = db.Categorias.Find(produto.Categoria.Id);
                db.Entry(produto).State = EntityState.Modified;
                db.SaveChanges();
            }

        }

    // Executa o método Editar

        Produto produto = new Produto
        {
             Id = 7,
             Nome = "Sorvete",
             Categoria = apCategoria.ListarItem(5)
         };
         apProduto.Editar(produto);

    • Editado LWMN quinta-feira, 13 de agosto de 2015 01:10
    quinta-feira, 13 de agosto de 2015 01:09
  • Olá WMN8,

     alguma novidade ? Pq não faz assim para testar :

    // Executa o método Editar
    
        var cat = apCategoria.ListarItem(5);
    
    if(cat != null)
    {  
    
        Produto produto = new Produto
        {
             Id = 7,
             Nome = "Sorvete",
             Categoria = cat
         };
         apProduto.Editar(produto);
    }
     Veja se entra no método editar ! Voltando a minha questão qual campo se relaciona entre um Produto e uma Categoria ?

    • Marcado como Resposta Marcos SJ sexta-feira, 21 de agosto de 2015 20:06
    segunda-feira, 17 de agosto de 2015 18:45
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 21 de agosto de 2015 20:06