Удалить продукт по идентификатору api/заказ/{id} EF C#

#c# #entity-framework

Вопрос:

Я хочу создать метод удаления из бд по идентификатору. Моя проблема в productcontroller.cs, я ввел неверный аргумент при вводе id var product = await _productRepository.RemoveProductByIdAsync()

ProductController.cs

 [HttpPut("{id}")]
        public async Task<IActionResult> RemoveProduct(long id)
        {
            var product = await _productRepository.RemoveProductByIdAsync();
            if ( product is null)
            {
                return NotFound();
            }

            
            product.Remove(RemoveProduct);
            return NoContent();


        }
 

ProductRespository.cs

  public async Task RemoveProductByIdAsync(Product product)
        {
            _context.Products.Remove(product);
            await _context.SaveChangesAsync();
        }
 

IProductRespository.cs

 Task RemoveProductByIdAsync(Product product);
 

Комментарии:

1. В приведенном вами примере есть много вещей, которые «выключены». 1) в данном случае это не httpput, а httpdelete. 2) вы получаете идентификатор, но никогда не передаете его в метод 3) вы ожидаете продукт, но никогда его не предоставляете.. 4) Идемпотентность? Если вы хотите удалить продукт, но он не найден — разве это не совсем то, что вы задумали? Зачем возвращать 404?

2. Я забыл о httpdelete, это моя вина. о 4) не найденный продукт, не может быть удален, вот почему я хочу вернуть 404.

3. Вот почему я намекнул на Идемпотенцию 🙂 — посмотрите

4. Ладно, я понимаю, что ты имеешь в виду, но все равно не могу найти проблему :/

Ответ №1:

Этот

 await _productRepository.RemoveProductByIdAsync();
 

действительно ли требуется продукт
Вы получаете идентификатор из задания

 [HttpDelete("{id}")]
        public async Task<IActionResult> RemoveProduct(long id)
 

Поэтому сначала купите свой продукт, например, вот так:

 var prod = await _productRepository.GetProductByIdAsync(id);
 

а затем удалите его; вот так:

 await _productRepository.RemoveProductByIdAsync(prod);
 

в целом:

 var prod = await _productRepository.GetProductByIdAsync(id);
if (prod != null)
{
     await _productRepository.RemoveProductByIdAsync(prod);
}
 

и не бросайте 404 — потому что вы все равно уже собирались его удалить

Комментарии:

1. если это действительно ответит на ваш вопрос, отметьте как решение, кстати

2. Что-то все еще не так, как в ProductRespository.cs есть not all code paths return a value

3. верните Ok() или что-то после этого?… это ваш код, а не мой