我有如下所示的控制器,api是从客户端调用的
[HttpPost("UpdateSomething")]
public IActionResult UpdateSomething([FromBody] UpdateSomethingRequestDTO request)
{
someService.UpdateUpdateSomething(request);
return Ok();
}
比在 UpdateUpdateSomething 中我想做一些 EF 操作来更新某些内容 但我必须在以下位置运行后台进程:
(dbContext is injected)
public void UpdateUpdateSomething(UpdateUpdateSomethingRequestDTO request)
{
var something = dbContext.Something
.Where(s => ... bla bla);
something.someField = "someValue";
dbContext.Something.Update(something );
dbContext.SaveChanges();
dbContext.Entry(something ).State = EntityState.Detached;
//finally after that operation I need to call asynch method
BackgroundOperation();
}
BackgroundOperation(){
var somethings= (from f in dbContext.Something.AsNoTracking()
//dbContext is still ok not disposed yet..
foreach (Something something in somethings)
{
var response = await _httpClient.GetAsync(url);
something.someField2 = response.text;
//dbContext was disposed automatically because that await
dbContext.Entry(Something).State = EntityState.Modified;
dbContext.SaveChanges();
dbContext.Entry(Something).State = EntityState.Detached;
}
}
我知道我是否会打电话
await someService.UpdateUpdateSomething(request);
dbContext 不会被释放,但我想在后台运行它..
我知道我可以重新初始化 dbContext 但这是最好避免的事情
using dbContext? dbContext = new();
单独调用 UpdateUpdateSomething 为其制作控制器等可以解决问题 但我需要在同一个控制器中运行它。
someService.UpdateUpdateSomething(request);
我看不到任何其他方法来处理这个问题。但也许您还有其他想法?
You need use Async Methods on dbcontext like FindAysnc()/SaveChangesAsync() to work in asynchronously.
public async Task<YourEntity?> UpdateAsync(int id, YourDto yourData)
{
var postModel = await _context.YourEntity.FindAsync(id);
//update data here...
await _context.SaveChangesAsync();
return data;
}