【问题标题】:UserManager - Access to Disposed ObjectUserManager - 访问已处置的对象
【发布时间】:2017-10-10 15:38:31
【问题描述】:

使用 ASP.NET Core 2。

我正在尝试初始化一些应用程序范围的数据。为此,我创建了一个名为DbInitializer 的新类,一个名为IDbInitializer 的接口,并在Startup.ConfigureServices 中将它们注册为AddScoped

然后从Startup.Configure,我调用DbInitializer.Initialize(),在该方法内部有几个调用UserManager

if (appDbContext.Roles.All(i => i.Name != adminGroupName))
{
    await roleManager.CreateAsync(new IdentityRole(adminGroupName));
};
var role = appDbContext.Roles.First(i => i.Name == adminGroupName);

if (appDbContext.Users.All(i => i.UserName != adminSettings.Username))
{
    await userManager.CreateAsync(new ApplicationUser { UserName = adminSettings.Username,
                                                        Email = adminSettings.Username,
                                                        FirstName = adminSettings.FirstName,
                                                        LastName = adminSettings.LastName,
                                                        EmailConfirmed = true }, adminSettings.Password);
}
var adminUser = appDbContext.Users.First(i => i.UserName == adminSettings.Username);

if (!appDbContext.UserRoles.Any(i => i.RoleId == role.Id && i.UserId == adminUser.Id))
{
    await userManager.AddToRoleAsync(adminUser, role.Name);
}

问题是我随机得到了异常

无法访问已处置的对象

来自userManager.CreateAsyncuserManager.AddToRoleAsync

【问题讨论】:

  • DbInitializer.Initialize() 是异步的吗?发布它的原型
  • 是的,它在 DbInitializer 中声明为:public async void Initialize()
  • 重命名为公共异步任务初始化()有帮助吗?
  • 使用 Oracles MySQL 提供程序?它在第一次查询(第一次工作,随后抛出)后被破坏并抛出对象处理异常。使用 Pomelo MySQL 提供程序
  • 我最终删除了所有异步代码。现在它起作用了。谢谢大家。

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


【解决方案1】:

我认为问题在于您的DbInitializer.Initialize() 方法调用(应标记为async 并返回Task)未正确等待,因为Startup.Configure 方法必须返回void。如果您将呼叫更改为 DbInitializer.Initialize().Wait(),它应该可以工作,这将等待任务完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多