.NET Core 2 ObjectDisposed исключение при создании нескольких пользователей одновременно - PullRequest
0 голосов
/ 04 мая 2018

Я хочу создать 5 пользователей при запуске и использовать только эти учетные записи. Стандартный механизм регистрации отключен.

Итак, я нашел этот пример кода, он работает, но только для создания первого пользователя в этом цикле. Когда он пытается создать 4 других пользователя, выдается исключение ObjectDisposed.

Я обнаружил почти такую ​​же проблему на github , которая, кажется, все еще открыта. Но я надеюсь, что в этом есть какое-то решение.

    //DbInitialize.cs
    public async Task Initialize()
    {
        _context.Database.EnsureCreated();

        if (!_context.Roles.Any(r => r.Name == "Administrator"))
        {                
            await _roleManager.CreateAsync(new IdentityRole("Administrator"));
        }

        if (!_context.Users.Any())
        {
            for (int i = 0; i < 5; i++)
            {
                string userName = "testuser" + (i + 1);
                string password = "Abc123456789";
                //line where exception occures when i=1
                var result =
                    await _userManager.CreateAsync(
                        new ApplicationUser {UserName = userName, Email = userName, EmailConfirmed = true},
                        password);
                if (result.Succeeded)
                {
                    var user = await _userManager.FindByEmailAsync(userName);
                    await _userManager.AddToRoleAsync(user, "Administrator");
                }
            }
        }
    }
    //startup.cs
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
        services.AddMvc().AddViewOptions(options => options.HtmlHelperOptions.ClientValidationEnabled = false);
        // Add Database Initializer
        services.AddScoped<IDbInitializer, DbInitializer>();            
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IDbInitializer dbInitializer)
    {
        if (env.IsDevelopment())
        {                
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseBrowserLink();
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        dbInitializer.Initialize();
    }

Примечание: инициализация _userManager находится внутри класса DbInitializer

    private readonly ApplicationDbContext _context;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly RoleManager<IdentityRole> _roleManager;

    public DbInitializer(
        ApplicationDbContext context,
        UserManager<ApplicationUser> userManager,
        RoleManager<IdentityRole> roleManager)
    {
        _context = context;
        _userManager = userManager;
        _roleManager = roleManager;
    }
...