如何使用 EF 操作处理异步方法并在此之前使用等待

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

我有如下所示的控制器,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);

我看不到任何其他方法来处理这个问题。但也许您还有其他想法?

entity-framework asynchronous async-await dispose
1个回答
0
投票
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.