-2

Estou criando uma API em c# .net 6.

O objetivo é fazer controle de estoque de produtos com entradas e saídas e total de estoque.

E é obrigatório a utilização de services, repositories, mapper, DTO's enfim, já criei as respectivas classes Produto e Controle estoque, está tudo funcionando.

As ações de Post, Get, GetbyId, Put e Delete, porém no Put (EditaProduto) ele dá o resultado 204 no content como esperado, mas não salva a atualização no banco de dados.

Estou dias procurando o erro e não encontro.

Esse é o trecho do código na Service:

public UpdateProdutoDto EditaProduto(int id, UpdateProdutoDto produtoDto)
        {
            var produto = _produtoRepository.RecuperaProdutoPorId(id);
            var prod = _produtoRepository.EditaProduto(id, produto);
            return _mapper.Map<UpdateProdutoDto>(prod);

        }

Esse é o trecho do código na Repository:

public Produto EditaProduto(int id, Produto produto)
        {
            var prod = _context.Produtos.Where(p => p.Id == id).FirstOrDefault();
            _context.Update(produto);
            _context.SaveChanges();
            return prod;

        }

E esse é o trecho do código na Controller:

[HttpPut("{id}")]
    public IActionResult EditaProduto(int id, [FromBody] UpdateProdutoDto produtoDto)
    {
        UpdateProdutoDto produto = _produtoService.EditaProduto(id, produtoDto);
        if (produto == null) return NotFound();
        return NoContent();
    }

Desde já, agradeço!

2
  • 1
    no método EditaProduto recebe o produto para alterar (produtoDto) mas não faz nada com ele na service? recupera o produto por id e faz update do mesmo produto, me parece que não vai mesmo mudar nada. Commented 14/04/2023 às 16:54
  • Então, sou iniciante e estou com bastante dificuldade nessa parte, não consigo entender o que devo retornar. Commented 14/04/2023 às 20:34

1 Resposta 1

0

Parece que o problema pode estar relacionado à forma como você está atualizando o objeto Produto no método EditaProduto da sua ProdutoRepository.

No trecho do código em questão:

public Produto EditaProduto(int id, Produto produto)
{
    var prod = _context.Produtos.Where(p => p.Id == id).FirstOrDefault();
    _context.Update(produto);
    _context.SaveChanges();
    return prod;
}

Você está buscando o produto original do banco de dados com base no id informado, e então chamando _context.Update(produto) para atualizar o objeto produto com as mudanças. No entanto, você está retornando o objeto original prod em vez do objeto atualizado produto.

Para corrigir esse problema, você pode fazer as seguintes alterações:

public Produto EditaProduto(int id, Produto produto)
{
    var prod = _context.Produtos.Find(id); // Troque o uso do FirstOrDefault() pelo Find()
    if (prod == null) return null; // Verifique se o produto existe

    // Atualize as propriedades do produto original com as do produto atualizado
    prod.Nome = produto.Nome;
    prod.Preco = produto.Preco;
    // Continue atualizando as outras propriedades conforme necessário

    _context.Update(prod);
    _context.SaveChanges();
    return prod;
}

Dessa forma, você atualiza o objeto original prod com as mudanças do objeto produto passado como parâmetro, e então salva as alterações no banco de dados com _context.SaveChanges(). Em seguida, você retorna o objeto original prod, que agora contém as mudanças atualizadas.

Além disso, é importante verificar se o produto existe no banco de dados antes de atualizá-lo, como feito no exemplo acima com if (prod == null) return null;, para garantir que você está atualizando um produto válido.

Espero que essa correção ajude a resolver o problema de atualização do produto na sua API. Certifique-se de também verificar outras partes do código, como o mapeamento de DTOs, para garantir que as informações estão sendo passadas corretamente entre as camadas da aplicação.

Você deve fazer log-in para responder a esta pergunta.

Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag .