我在配置方法中的 Startup.cs 文件末尾调用了这个播种器类:
public class UserSeeder
{
private readonly ApplicationDbContext _context;
private readonly UserManager<ApplicationUser> _userManager;
public UserSeeder(ApplicationDbContext context, UserManager<ApplicationUser> userManager)
{
_context = context;
_userManager = userManager;
}
public async Task Seed()
{
if (!await _context.Users.AnyAsync())
{
var user = new ApplicationUser()
{
UserName = "admin",
Email = "admin@test.com"
};
await _userManager.CreateAsync(user, "passwort4admin");
}
}
}
代码被执行,我什至在方法调用周围进行了尝试/捕获,但没有发生错误,也没有用户插入数据库!
为什么不呢?
问题是密码的复杂性。添加大写字母、数字和符号 问题将解决
幕后,UserManager<>
使用IUserStore
您是否在启动时.cs在 IOC 容器中配置了此用户存储?
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<MyContext, Guid>()
.AddUserStore<ApplicationUserStore>() //this one provides data storage for user.
.AddRoleStore<ApplicationRoleStore>()
.AddUserManager<ApplicationUserManager>()
.AddRoleManager<ApplicationRoleManager>()
.AddDefaultTokenProviders();
就我而言,它是用户名中的一个空格。您可能设置了其他约束,使用户创建操作非法。
在大多数情况下,可以通过调查操作中返回的对象中的消息来获取有关错误确切原因的显式信息。
IdentityUser userToBe = ...
IdentityResult result = await UserManager.CreateAsync(userToBe);
if(!result.Succeeded)
foreach(IdentityError error in result.Errors)
Console.WriteLine($"Oops! {error.Description} ({error.Code}));
我忘了设置"用户名",它不能为空。我设置了用户名=用户电子邮件,它可以工作
甚至无法获得result
检查的人: 请确保在 Program.cs
中await
播种器方法,否则该方法可能会失败并且不会返回:
using var scope = app.Services.CreateScope()
await scope.ServiceProvider.GetRequiredService<UserSeeder>().Seed();
然后它将为app.Run();
做好准备