尝试在 .NET Core 3.0 中播种角色时获取任务被取消错误

Getting a task was canceled error when trying to seed roles in .NET Core 3.0

在我的 .NET Core 3.0 应用程序中,我试图在应用程序第一次执行并连接到数据库时将新角色和用户植入数据库。

所以我写了这个简单的 class:

public static class UserAndRoleDataInitializer
{
    public static void SeedData(UserManager<AppUser> userManager, RoleManager<IdentityRole<Guid>> roleManager)
    {
        SeedRoles(roleManager);
        SeedUsers(userManager);
    }

    private static async void SeedRoles(RoleManager<IdentityRole<Guid>> roleManager)
    {           
        var exists = await roleManager.RoleExistsAsync("administrator");
        if (!exists)
        {               
            await roleManager.CreateAsync(new IdentityRole<Guid>("administrator"));
        }

        exists = await roleManager.RoleExistsAsync("editor");
        if (!exists)
        {
            await roleManager.CreateAsync(new IdentityRole<Guid>("editor"));
        }
    }

    ...
}

Program.cs 调用:

var userManager = serviceProvider.GetRequiredService<UserManager<AppUser>>();
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole<Guid>>>();
UserAndRoleDataInitializer.SeedData(userManager, roleManager);

每次执行SeedData我都会得到以下错误:

System.Threading.Tasks.TaskCanceledException: 'A task was canceled.'

SeedRoles的第一行:var exists = await roleManager.RoleExistsAsync("administrator");

我在网上进行了研究,试图找到一些答案,但找不到与我的用例类似的任何内容。任何帮助将不胜感激。

这个函数是异步的。

UserAndRoleDataInitializer.SeedData(userManager, roleManager).GetAwaiter().GetResult();

会成功的。

@Guilherme 的评论真的很有帮助。

这就是我为让它工作所做的工作:

public static class UserAndRoleDataInitializer
{
    public static async Task<IdentityResult> SeedData(UserManager<AppUser> userManager, RoleManager<IdentityRole<Guid>> roleManager)
    {
        await SeedRoles(roleManager);
        await SeedUsers(userManager);

        return IdentityResult.Success;
    }

    private static async Task<IdentityResult> SeedRoles(RoleManager<IdentityRole<Guid>> roleManager)
    {                       
        var exists = await roleManager.RoleExistsAsync("Administrator");
        if (!exists)
        {               
            await roleManager.CreateAsync(new IdentityRole<Guid>("Administrator"));
        }
        ...
        return IdentityResult.Success;
    }

    private static async Task<IdentityResult> SeedUsers(UserManager<AppUser> userManager)
    {            
        var usr = await userManager.FindByNameAsync("admin");
        if (usr == null)
        {
            AppUser user = new AppUser
            {
                UserName = "admin",
                Email = "gbetsos@yahoo.com",
                FirstName = "Giorgos",
                LastName = "Betsos"
            };

            IdentityResult result = await userManager.CreateAsync(user, "P@ssw0rd1!");

            if (result.Succeeded)
            {
                await userManager.AddToRoleAsync(user, "Administrator");
            }
        }

        return IdentityResult.Success;
    } 
}

最后但同样重要的是,这是从 Main 调用 SeedData 的方式:

 UserAndRoleDataInitializer.SeedData(userManager, roleManager).Wait();