如何通过异步网络 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 任务制作的东西。几个选项是:
- HangFire
- Azure WebJobs / Cloud Services
- Windows 服务
这是一本关于您遇到的确切问题的非常好的读物。
HowToRunBackgroundTasksInASPNET
我正在使用网络 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 任务制作的东西。几个选项是:
- HangFire
- Azure WebJobs / Cloud Services
- Windows 服务
这是一本关于您遇到的确切问题的非常好的读物。 HowToRunBackgroundTasksInASPNET