【问题标题】:How to resolve object disposed exception ASP.NET Core with Entity Framework and Identity如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core
【发布时间】: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&lt;T&gt;
  • @Tseng 我对大多数概念 - .net 核心、实体和身份都是新手,所以如果这不能回答您的问题,我深表歉意。在我的 Startup.ConfigServies 中,我有:services.AddIdentity&lt;ApplicationUser, IdentityRole&gt;()services.AddScoped&lt;UserManager&lt;ApplicationUser&gt;&gt;();。应用程序用户扩展 IdentityUser。
  • 身份由数据库支持,并且提供者连接它。将其视为数据库驱动程序。您在 Identity 中使用哪个数据库?微软SQL?石榴石? mysql? PostgreSQL?在 UserManager 中没有调用 dispose 的代码,它只是将其委托给提供者。 SQLServer 提供程序也没有处理,所以我怀疑您正在使用其他一些提供程序。此外,您不需要手动注册services.AddScoped&lt;UserManager&lt;ApplicationUser&gt;&gt;();,Identity 应该已经这样做了,iirc
  • @Tseng 感谢您的解释!我正在使用 MSSQLLocalDB。
  • 把方法声明改成async Task而不是async void能解决吗?

标签: c# entity-framework asp.net-core asp.net-identity


【解决方案1】:

将您的控制器操作声明为async Task,而不是async void

对于后者,只要您的方法遇到第一个 await,它就会将控制权返回给调用者,并且因为 ASP.NET 现在无法跟踪其进度(就像它返回 @987654324 时一样@ 代替),它会处理您的控制器实例,并且(很可能)连同它一起处理任何本地范围的字段。


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

【讨论】:

    猜你喜欢
    • 2018-02-12
    • 2019-02-19
    • 2018-01-05
    • 2017-11-30
    • 2020-09-18
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多