如何使用实体框架和身份解析对象处置异常ASP.NET Core

wes*_*and 6 c# entity-framework asp.net-identity asp.net-core

我正在尝试编写一个控制器,它接收来自AJAX调用的请求,并通过DBContext执行对数据库的一些调用.但是,当我将命令var user = await GetCurrentUserAsynch();放在对DBContext的任何调用之前时,如下所示,我得到一个ObjectDisposedException(无法访问已处置的对象).

它似乎是UserManager和DBContext没有很好地在一起播放,但我找不到有关此事的更多信息.

[HttpPost]        
public async void EditUserMapItemAjax([FromBody]UserMapItemViewModel userMapItemViewModel)
{            
    var user = await GetCurrentUserAsync();
    var mapItem = _db.MapItems.SingleOrDefault(x => x.Id == userMapItemViewModel.MapItemId);   

    ...
}

private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
Run Code Online (Sandbox Code Playgroud)

sel*_*ape 25

声明你的控制器动作async Task,而不是async void.

对于后者,只要你的方法遇到第一个await,它就会将控制权返回给调用者,并且因为ASP.NET现在无法跟踪它的进度(就像它返回的Task那样),它会处理你的控制器实例和(最有可能的)以及任何本地范围的字段.


当你在那里时,无论如何你都是异步方法,你应该更喜欢EF调用的异步版本; 即await _db.MapItems.SingleOrDefaultAsync()