#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() или что-то после этого?… это ваш код, а не мой