【问题标题】:getting Error while ef core seeding the dataef core 播种数据时出错
【发布时间】:2020-03-17 17:16:55
【问题描述】:

下面是我的种子类..

   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);调用这个方法

在播种时出现低于错误的错误..我正在为 postgresql 使用 ef core 3.. 我得到了

System.ObjectDisposedException: '无法访问已处置的对象。 对象名称:'MyUserManager'。'

【问题讨论】:

  • 您应该返回任务并一直等待它们。不要从async 方法返回voiddocs.microsoft.com/en-us/archive/msdn-magazine/2013/march/… 请在Startup.cs 文件中显示您调用DataInitializer.SeedData(userManager, roleManager); 的代码。
  • public void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserManager userManager, RoleManager roleManager) { DataInitializer.SeedData(userManager, roleManager); }
  • 感谢我在配置方法中调用最后一行...

标签: asp.net-core ef-core-3.0


【解决方案1】:

尝试一直使用任务 - 如果您不返回任何内容以等待代码将继续处理,即使某些事情尚未完成。

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)
{
    ⋮
}

您还可以将此调用移动到您的Program.csMain 方法中,因为该方法可以设置为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);
}

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多