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

Gravando produtos no banco de dados

Três dúvidas:

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.

2) Toda vez que a aplicação for inicializada será cadastrado na tabela Produtos ?? Não haverá repetição de registros?

3) Onde que ficou definido a injeção de dependência do ApplicationContext?

3 respostas
solução!

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.

Obrigada pela resposta. Não tinha chegado na parte do curso que executava a verificação para fazer o insert na tabela.

Legal, Tauan! Obrigado por participar do fórum. Qualquer dúvida, estamos aí.

Boa sorte e bons estudos!