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

Duvida ao criar uma categoria

Na parte de " #Antes de salvar um produto, criar categoria se necessário", na funcionalidade 1, me perco sempre onde devo implementar esse if, alguma dica? . Desde já, grato

4 respostas

Consegui resolver, no entanto, na última parte do projeto onde eu tenho que descomentar a linha do método de importação, surge os seguintes erros :

System.AggregateException: 'One or more errors occurred. (Invalid column name 'Nome'.
Invalid column name 'Nome'.)'
SqlException: Invalid column name 'Nome'.
Invalid column name 'Nome'.

Minha CategoriaRepository ficou:

 public interface ICategoriaRepository
    {
        Task<Categoria> NewCategoria(string nome);
    }

    public class CategoriaRepository : BaseRepository<Categoria>, ICategoriaRepository
    {
        public CategoriaRepository(ApplicationContext contexto) : base(contexto)
        {
        }

        public async Task<Categoria> NewCategoria(string nome)
        {
            var categoriaDB = dbSet.Where(c => c.Nome == nome)
                .SingleOrDefault();

            if (categoriaDB == null) 
            {
                var novaCategoria = new Categoria()
                {
                    Nome = nome
                };

                categoriaDB = dbSet.Add(novaCategoria).Entity;
            }
            await contexto.SaveChangesAsync();
            return categoriaDB;
        }
    }

E ProdutoRepository ficou :


        private readonly ICategoriaRepository categoriaRepository;

        public ProdutoRepository(ApplicationContext contexto, ICategoriaRepository categoriaRepository) : base(contexto)
        {
            this.categoriaRepository = categoriaRepository;
        }
        public IList<Produto> GetProdutos()
        {
            return dbSet.ToList();
        }

        public async Task SaveProdutos(List<Livro> livros)
        {
            foreach (var livro in livros)
            {

                if (!dbSet.Where(p => p.Codigo == livro.Codigo).Any())
                {
                    Categoria categoria = await categoriaRepository.NewCategoria(livro.Categoria);
                    dbSet.Add(new Produto(livro.Codigo, livro.Nome, livro.Preco, categoria));
                }
            }
            await contexto.SaveChangesAsync();
        }
    }

    public class Livro
    {
        public string Codigo { get; set; }
        public string Nome { get; set; }
        public string Categoria { get; set; }
        public string Subcategoria { get; set; }
        public decimal Preco { get; set; }
    }

No modelo.cs, adicionei:

public class Categoria : BaseModel
    {
        public Categoria()
        {

        }
        public string Nome { get; set; }
    }

Em ApplicationContext , ficou:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Produto>().HasKey(t => t.Id);

            modelBuilder.Entity<Pedido>().HasKey(t => t.Id);
            modelBuilder.Entity<Pedido>().HasMany(t => t.Itens).WithOne(t => t.Pedido);
            modelBuilder.Entity<Pedido>().HasOne(t => t.Cadastro).WithOne(t => t.Pedido).IsRequired();

            modelBuilder.Entity<ItemPedido>().HasKey(t => t.Id);
            modelBuilder.Entity<ItemPedido>().HasOne(t => t.Pedido);
            modelBuilder.Entity<ItemPedido>().HasOne(t => t.Produto);

            modelBuilder.Entity<Cadastro>().HasKey(t => t.Id);
            modelBuilder.Entity<Cadastro>().HasOne(t => t.Pedido);

            modelBuilder.Entity<Produto>().HasKey(t => t.Id);
            modelBuilder.Entity<Produto>().HasOne(t => t.Categoria);
        }

Boa tarde, Gabriel Bueno Guimaraes ! Tudo bem?

Você poderia dizer em qual parte do código está ocorrendo esses erros? Qual classe?

Grato, Leonardo

O erro está ocorrendo na classe Startup , quando eu tiro a parte comentada do código. Upei o meu arquivo no DropBox caso você prefira fazer o download.

https://www.dropbox.com/s/sjddf3nz1vc4fwc/AluraNetJunior-master.rar?dl=0

solução!

Oi Gabriel, tudo bom?

Pelo seu erro:

SqlException: Invalid column name 'Nome'.

Parece que essa coluna não existe no seu banco. Porém, pela parcela do erro que a gente tem não da pra saber exatamente em que tabela essa coluna não existe.

Dei uma olhada nas migrations que criam seu banco de dados e não reparei em nada que justificasse o problema.

Da uma verificada no seu banco de dados pra ver se todas as tabelas que deveriam ter a coluna Nome (como Produto,Categoria e Cadastro) realmente tem essa coluna.

Uma outra abordagem é remover seu banco de dados e deixar as migrations recriarem ele.

As vezes pode ficar alguma sujeira de dados que impede a execução das migrações =)

Verifica se todas as migrações estão sendo executadas com sucesso no seu banco de dados.

Abraço