Olá, Tauan
1) Se a classe Livro tem os mesmos atributos que a classe Produto, porquê não consigo desserializar o json para uma lista de produtos? Os atributos Código e Nome vem nulos e o Preço como 0. A princípio achei que era porque os setores desses atributos eram privados, porém mesmo após deixá-los públicos a situação anterior aconteceu.
A estrutura de Livro
é diferente de Produto
. Por exemplo, em Livro
temos a Categoria
como string:
public string Categoria { get; set; }
Mas Produto.Categoria
não é string (como definido na estrutura do arquivo .json), e sim do tipo Categoria
:
public Categoria Categoria { get; set; }
Essa diferença nas estruturas invalida a desserialização do arquivo .json, e assim os objetos não são preenchidos (isto é, aparecem com os valores default, com zeros e nulls).
2) Toda vez que a aplicação for inicializada será cadastrado na tabela Produtos ?? Não haverá repetição de registros?
Não, porque fazemos uma verificação na hora de salvar os produtos:
public void SaveProdutos(List<Livro> livros)
{
foreach (var livro in livros)
{
if (!dbSet.Where(p => p.Codigo == livro.Codigo).Any())
{
var categoria = categoriaRepository.Inserir(livro.Categoria);
dbSet.Add(new Produto(livro.Codigo, livro.Nome, livro.Preco, categoria));
}
}
contexto.SaveChanges();
}
Note que a condição if (!dbSet.Where(p => p.Codigo == livro.Codigo).Any())
impede que produtos com mesmo código sejam adicionados se já existirem no banco.
3) Onde que ficou definido a injeção de dependência do ApplicationContext?
Lembra do método ConfigureServices
da classe Startup
? Nela, o método AddDbContext
registra o ApplicationContext
como um serviço, e assim ele pode ser usado como parâmetro com injeção de dependência.
services.AddDbContext<ApplicationContext>(options =>
options.UseSqlServer(connectionString)
);
Note que esse método não só registra ApplicationContext
para injeção de dependência, mas tem uma função adicional de informar que essa classe é usada como contexto do Entity Framework Core.