【发布时间】:2016-12-19 19:26:26
【问题描述】:
我正在尝试编写一个控制器,它接收来自 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);
【问题讨论】:
-
您使用的是哪个提供商? GetUserAsync 只是将调用包装在底层
IUserStore<T> -
@Tseng 我对大多数概念 - .net 核心、实体和身份都是新手,所以如果这不能回答您的问题,我深表歉意。在我的 Startup.ConfigServies 中,我有:
services.AddIdentity<ApplicationUser, IdentityRole>()和services.AddScoped<UserManager<ApplicationUser>>();。应用程序用户扩展 IdentityUser。 -
身份由数据库支持,并且提供者连接它。将其视为数据库驱动程序。您在 Identity 中使用哪个数据库?微软SQL?石榴石? mysql? PostgreSQL?在 UserManager 中没有调用 dispose 的代码,它只是将其委托给提供者。 SQLServer 提供程序也没有处理,所以我怀疑您正在使用其他一些提供程序。此外,您不需要手动注册
services.AddScoped<UserManager<ApplicationUser>>();,Identity 应该已经这样做了,iirc -
@Tseng 感谢您的解释!我正在使用 MSSQLLocalDB。
-
把方法声明改成
async Task而不是async void能解决吗?
标签: c# entity-framework asp.net-core asp.net-identity