在我的 .NET Core 3.0 应用程序中,我试图在应用程序第一次执行并连接到数据库时将新角色和用户植入数据库。
所以我写了这个简单的类:
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");
我研究了网络,试图找到一些答案,但找不到与我的用例类似的东西。任何帮助将不胜感激。
最佳答案
@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;
}
}
最后但并非最不重要的是,这就是
SeedData
从 Main
调用: UserAndRoleDataInitializer.SeedData(userManager, roleManager).Wait();
关于c# - 尝试在 .NET Core 3.0 中植入角色时,获取任务被取消错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58995827/