我正在使用 EntityFramework 在 .NET6 中制作简单的 WebAPI,它将数据存储在内存中。 API 将操作 dbContext 中的数据,其控制器将根据传入请求(Get、Post、Put、Delete)调用这些数据。
我想知道控制器中用于删除实体的方法应该是什么样子,以便可以正确完成(我想了解如何正确完成)。我目前控制器中有这个功能
[HttpDelete("id")]
public async Task<IActionResult> DeleteProduct(int id)
{
await _productRepository.Delete(id);
return Ok();
}
以及repo中的删除功能
public async Task Delete(int id)
{
// var p = await dbContext.FindAsync(typeof(Product), id);
var p = await dbContext.Products.FindAsync(id);
if (p == null)
return;
dbContext.Products.Remove(p);
await dbContext.SaveChangesAsync();
return;
}
但是在这种情况下,如果有人发送请求,他们不知道该实体是否已成功删除,他们实际上什么都不知道。我正在考虑这种方法,问题是它是否正确,或者是否应该以不同的方式完成这些事情(存储库服务中的返回类型可能不同,然后在控制器中检查返回的值然后响应)
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var entity = _repository.GetEntityById(id);
if (entity == null)
{
return NotFound(); // 404 error
}
_repository.DeleteEntity(entity);
return NoContent(); // 204 error
}
这种方法在控制器方法中进行了 2 个操作:查找然后删除,这就是为什么我正在考虑这是否不应该出现在存储库方法中。
如果您使用 EF Core 7,要删除一个或多个实体,您应该使用 ExecuteDelete() :
int deletedRows = dbContext.Products.Where(c => c.id == 1).ExecuteDelete();
因此您不需要Find然后Remove(生成2个SQL命令行)。仅使用一个 SQL DELETE FROM...WHERE。同时,如果其他人删除了相同的数据,您也不例外。
将其放在代码中的任何位置,您无需担心其他任何事情。
附注如果您使用的是早期版本的 EF Core,则可以使用 dbContext.Database.ExecuteSqlRaw(sqlcommand) 发送“DELETE FROM...”:它总是比“查找并删除”更快。