Usuário com melhor resposta
Alterar categoria de produto com EntityFramework 6

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
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
Todas as Respostas
-
-
Olá,
pode ser relacionamento, qual o erro gerado ?
-
-
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();
// EditarProduto 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();
} -
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();
// EditarProduto 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
-
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
-
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.