Ошибка при загрузке данных ядра - PullRequest
0 голосов
/ 17 марта 2020

Ниже приведен мой начальный класс ..

   public static class DataInitializer
    {
        public static async void SeedRolesAsync(RoleManager<Role> roleManager)
        {
            if (roleManager.RoleExistsAsync("Administrator").Result)
                return;

            var role = new Role
            {
                Name = "Administrator",
                Description = "Perform all the operations."
            };
            await roleManager.CreateAsync(role);


        }

        public static async void SeedRoleClaimsAsync(RoleManager<Role> roleManager)
        {



            var role = await roleManager.FindByNameAsync("Administrator");


            var roleClaims = await roleManager.GetClaimsAsync(role);

            foreach (var claimString in AllClaims.GetList())
            {
                var newClaim = new Claim(claimString, "");
                if (!roleClaims.Any(rc => rc.Type.ToString() == claimString))
                {
                    await roleManager.AddClaimAsync(role, newClaim);
                }
            }
        }

        public static async void SeedUsersAsync(UserManager<User> userManager)
        {
            var user = new User
            {
                UserName = "admin@example.com",
                Email = "admin@example.com",
                FirstName = "Admin",
                LastName = "User",
                Enabled = true
            };
            var result = await userManager.CreateAsync(user, "Admin@123");
            if (result.Succeeded)
            {
                await userManager.AddToRoleAsync(user, "Administrator");
            }
        }

        public static void SeedData(UserManager<User> userManager, RoleManager<Role> roleManager)
        {
            SeedRolesAsync(roleManager);
            SeedRoleClaimsAsync(roleManager);
            SeedUsersAsync(userManager);
        }
    }

, вызывающий этот метод в классе запуска DataInitializer.SeedData(userManager, roleManager);

Получаю ошибку ниже ошибки при заполнении. Я использую ef core 3 для postgresql .. Получаю

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту. Имя объекта: 'MyUserManager'. '

enter image description here

1 Ответ

2 голосов
/ 17 марта 2020

Попробуйте использовать задачи полностью - если вы ничего не возвращаете, чтобы ждать, если есть вероятность, что код будет продолжен с утилизацией, даже если что-то еще не завершено.

public static async Task SeedData(UserManager<User> userManager, RoleManager<Role> roleManager)
{
    await SeedRolesAsync(roleManager);
    await SeedRoleClaimsAsync(roleManager);
    await SeedUsersAsync(userManager);
}

public static async Task SeedRolesAsync(RoleManager<Role> roleManager)
{
    ⋮
}

public static async Task SeedRoleClaimsAsync(RoleManager<Role> roleManager)
{
    ⋮
}

public static async Task SeedUsersAsync(UserManager<User> userManager)
{
    ⋮
}

Вы также можете переместить этот вызов в Main метод вашего Program.cs, потому что этот метод может быть сделан async.

public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();
    using (var scope = host.Services.CreateScope())
    using (var userManager = scope.ServiceProvider.GetRequiredService<UserManager<User>>())
    using (var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<Role>>())
    {
        await DataInitializer.SeedData(userManager, roleManager).ConfigureAwait(false);
    }

    await host.RunAsync().ConfigureAwait(false);
}
...