我有一个DELETE和PUT方法,它包含相同的代码以从数据库中获取ID列表,并在执行操作之前检查它们是否存在:
try
{
var ids =
(await _testTableTbRepository.GetAllAsync())
.Select(_ => new TestTableTbModel { Id = _.Id }).OfType<int>().ToList();
if (!ids.Contains(model.Id))
{
return StatusCode(400, "Id: " + model.Id + " does not exist");
}
await _testTableTbRepository.DeleteAsync(model.Id);
return Ok(model.Id);
}
catch (Exception e)
{
return StatusCode(500, e);
}
我的想法是,Ids到整数的转换不能正常工作,所以它一直被if语句捕获并返回400状态。有没有人看到这个有什么问题?有没有更好的方法来写这个?
答案 0 :(得分:2)
为什么这一切都麻烦?让DB帮您改为使用DBException。
这样你就不会在内存中加载一个巨大的数据库并保存一个巨大的调用以及所有选择并包含检查的内容。
try
{
await _testTableTbRepository.DeleteAsync(model.Id);
return Ok(model.Id);
}
catch(DbException e)
{
return StatusCode(404, "Id: " + model.Id + " does not exist");
}
catch (Exception e)
{
return StatusCode(500, e);
}
感谢@Fran指出400 - &gt; 404
答案 1 :(得分:0)
我不确定如何实现_testTableRepository,但我假设它只是包装了EF函数。
var exists = await _testTableRepository.FindAsync(model.Id);
if (!exists)
return NotFound();
_testTableRepository.Delete(Model.Id);
return Ok(model.Id);
不要打扰try catch块。大多数异常将自动转换为500响应代码。如果这是你的所有try / catch正在做的事情,那就让框架处理它。
通过id检查您想要的记录也很容易。就像我说的那样,我假设您的存储库只是转发对EF DbContext的调用,它将在其上有一个FindAsync()方法。