无法在Program.cs中创建和授予用户角色



项目为ASP。.NET Core MVC, .NET 6。我正在尝试播种一个角色,如果它还没有,并创建一个用户,将有这个角色。我尝试了各种方法来扭曲代码,但它不起作用。当我第一次运行应用程序时,在将用户添加到角色的行中出现以下错误:

Microsoft.EntityFrameworkCore。DbUpdateException: '在保存实体更改时发生错误。'

SqlException: INSERT语句冲突了外键约束"FK_AspNetUserRoles_AspNetUsers_UserId"。冲突发生在数据库"viewmovies"、表"dbo. aspnetusers"和列"Id"中。语句已被终止。

然后当我检查数据库时,新角色创建了,但用户没有。

这些都发生在Program.cs中。这里我创建了作用域,并使用它来获取角色管理器和用户管理器。然后,如果该角色不存在,则创建该角色并创建一个新用户。然后将新角色添加给新用户。

var app = builder.Build();
var scope = app.Services
.GetService<IServiceScopeFactory>()
?.CreateScope();
if (scope is not null)
{
using (scope)
{
var roleManager = scope
.ServiceProvider
.GetService<RoleManager<IdentityRole>>();
var userManager = scope
.ServiceProvider
.GetRequiredService<UserManager<User>>();

Task
.Run(async () =>
{
if (await roleManager.RoleExistsAsync("test"))
{
return;
}
var role = new IdentityRole { Name = "test" };
await roleManager.CreateAsync(role);
const string testEmail = "test@role.com";
const string testPassword = "test123";
var user = new User
{
Email = testEmail,
UserName = testEmail
};
await userManager.CreateAsync(user, testPassword);
await userManager.AddToRoleAsync(user, role.Name);
})
.GetAwaiter()
.GetResult();
}
}

我已经注册了这些服务:

builder.Services.AddDefaultIdentity<User>()
.AddRoles<IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddEntityFrameworkStores<ViewMoviesDbContext>();

问题出在我为新用户创建的数据上。根据服务中设置的密码限制,密码无效。密码"test123"不包含大写字母和非数字字母,默认不包含。改成Test123+解决了这个问题。

根据错误,您似乎正在尝试创建具有相同Id,电子邮件等的用户。使user成为同一用户的实例。在同一用户上添加角色会导致错误,因为该用户已经拥有该角色。你应该试着用不同的邮箱创建一个用户。

在身份服务器数据库中,它使用电子邮件来唯一标识用户。试一试清除用户表数据(如果可能的话)和角色。

最新更新