从控制器或存储库服务中的dbContext中删除实体的逻辑?

问题描述 投票:0回答:1

我正在使用 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 个操作:查找然后删除,这就是为什么我正在考虑这是否不应该出现在存储库方法中。

c# .net entity-framework asp.net-web-api
1个回答
0
投票

如果您使用 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...”:它总是比“查找并删除”更快。

© www.soinside.com 2019 - 2024. All rights reserved.