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

Programa não roda na ultima etapa

Olá, fui fazendo todas as etapas para colocar a funcionalidade #1, de definir a categoria de cada livro, deu tudo certo e tudo funcionando, até que eu fiz o ultimo passo que é descomentar a linha

serviceProvider.GetService<IDataService>().InicializaDB().Wait();

Apos descomentar essa linha, quando eu executo o programa, ele lança uma exceção e trava..

Ja revisei tudo varias e varias vezes e não consigo achar o problema, gostaria de saber se alguém pode me ajudar com isso

Obrigado

Exceção --> https://imgur.com/TsnwBnM

Link do meu projeto --> https://github.com/marcopandolfo/Projeto-Formacao-DotNet

2 respostas
solução!

Oi Marco, tudo bem?

Baixei o seu programa, e tive que fazer algumas alterações para ele funcionar. Fique atento nestes passos:

  1. ICategoriaRepository: fiz o método NovaCategoria retornar uma task contendo a categoria, e não void:
    public interface ICategoriaRepository
    {
        Task<Categoria> NovaCategoria(string nome);
    }
  1. CategoriaRepository: fiz o método NovaCategoria retornar uma task contendo a categoria, e não void, e além disso obtive a entidade ao adicionar a categoria com dbSet.Add(), e ao final do método essa categoria é retornada:
        public async Task<Categoria> NovaCategoria(string nome) //método assíncrono para salvar uma nova categoria
        {
            var categoria = dbSet.Where(c => c.Nome == nome)
                .SingleOrDefault();

            if(categoria == null) // Se a categoria for nula, ou seja, se nao existir, ai ele cria a categoria
            {
                var novaCategoria = new Categoria()
                {
                    Nome = nome
                };

                categoria = dbSet.Add(novaCategoria).Entity;
            }
            await contexto.SaveChangesAsync();
            return categoria;
        }
  1. modelo.cs: removi a propriedade Categoria.Id, pois essa propriedade já é herdada de BaseModel:
    public class Categoria : BaseModel
    {
        public Categoria()
        {
        }

        //public int Id { get; set; }
        public string Nome { get; set; }
    }
  1. modelo.cs: adicionei um parâmetro categoria no construtor da classe Produto:
        public Produto(string codigo, string nome, decimal preco, Categoria categoria)
        {
            Codigo = codigo;
            Nome = nome;
            Preco = preco;
            Categoria = categoria;
        }
  1. ProdutoRepository.cs: No método SaveChanges, inverti a ordem, salvando primeiro a categoria e só depois o produto:
        public async Task SaveProdutos(List<Livro> livros)
        {
            foreach (var livro in livros)
            {
                if (!dbSet.Where(p => p.Codigo == livro.Codigo).Any())
                {
                    //dbSet.Add(new Produto(livro.Codigo, livro.Nome, livro.Preco));

                    //categoriaRepository.NovaCategoria(livro.Categoria); //Vai criar a categoria, se necessario


                    Categoria categoria = await categoriaRepository.NovaCategoria(livro.Categoria); //Vai criar a categoria, se necessario
                    dbSet.Add(new Produto(livro.Codigo, livro.Nome, livro.Preco, categoria));
                }
            }
            await contexto.SaveChangesAsync();
        }

Ah, e não se esqueça de apagar o banco de dados antes de seguir esses passos. Boa sorte!

Obrigado