如何通过异步网络 api 更新 entityframework 中的多个数据

how to update multiple data in entityframework through async web api

我正在使用网络 api 2 和 entity framework 6。我创建了一个异步网络 api,它会立即更新所有记录。我也在使用 Autofac 进行依赖注入。

我的服务界面如下:

Task<Approval> TakeAction(int id, bool isApprove)
void TakeAction(bool isApprove)

这些是我的服务方式:

  public async void TakeAction(bool isApprove)
    {
//GetAllDataToApprove is the same function in the service.
        var approvalList= GetAllDataToApprove().Approvals.ToList();
        foreach (var approval in Approvals)
        {
//This is an async method as well
            await TakeAction(approval.ApprovalId, isApprove);
        }
    }

TakeAction方法如下:

  public async Task<Approval> TakeAction(int id, bool isApprove)
    {
        Approval approval= approvalrepository.Query(o => o.ApprovalId == id).FirstOrDefault();
        try
        {
//updating the approval status
           approval.StatusId=5
                    UpdateDashboard(approval);                   

                approvalrepository.Update(approval);
                await unitOfWork.SaveChangesAsync();
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return approval;
    }

我的web-API方法如下:

     [HttpPut]
    public IHttpActionResult Put(bool isApprove)
    {
        try
        {
            approvalservice.TakeAction(isApprove);

            return Ok();
        }
        catch (Exception ex)
        {
            throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message));
        }
    }

我想进行非阻塞 API 调用,这样,如果此 API 被触发,它应该批准所有未决数据。之所以做这个async,是因为pending list里面的数据比较多,所以时间比较长。

我收到以下错误: 操作无法完成,因为 DbContext 已被释放。

如果我正确理解你的问题,归结为:

How do I start a long running task from an API call but respond before it is finished.

简答:

您不在 API 中。您委托给 Service.

长答案:

您遇到的错误很可能是由于 Autofac。使用 Web Api 请求,您可以在请求开始时初始化所需的所有内容,并在结束时将其删除。在您的代码中,您试图在请求结束并被丢弃后用 DbContext 做一些事情。要解决此问题,只需像这样添加 await await approvalservice.TakeAction(isApprove);.

执行上述操作意味着您现在正在等待该过程完成。这不是你想要的。但这是唯一的方法,因为 Web Api 就是这样工作的。

您需要做的是将工作委托给服务。为 运行 长 运行ning 任务制作的东西。几个选项是:

  1. HangFire
  2. Azure WebJobs / Cloud Services
  3. Windows 服务

这是一本关于您遇到的确切问题的非常好的读物。 HowToRunBackgroundTasksInASPNET