Oi Marco, tudo bem?
Baixei o seu programa, e tive que fazer algumas alterações para ele funcionar. Fique atento nestes passos:
- ICategoriaRepository: fiz o método
NovaCategoria
retornar uma task contendo a categoria, e não void:
public interface ICategoriaRepository
{
Task<Categoria> NovaCategoria(string nome);
}
- 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;
}
- 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; }
}
- 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;
}
- 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!