Проект ASP.NET Core MVC, .NET 6. Я пытаюсь создать роль, если ее еще нет, и создать пользователя, который будет иметь эту роль. Я пробовал всячески крутить код, и это не работает. Когда я запускаю приложение в первый раз, в строке, где пользователь добавляется в роль, появляется следующая ошибка:
Microsoft.EntityFrameworkCore.DbUpdateException: «Произошла ошибка при сохранении изменений объекта. Подробности смотрите во внутреннем исключении».
SqlException: инструкция INSERT конфликтует с ограничением FOREIGN KEY «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 = "[email protected]";
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>();
Судя по ошибке, кажется, что вы пытаетесь создать пользователя с тем же идентификатором, адресом электронной почты и т. д., что приводит к тому, что пользователь является экземпляром одного и того же пользователя. Добавление роли для того же пользователя вызывает ошибку, поскольку у пользователя уже есть роль. Вы должны попытаться создать пользователя с другим адресом электронной почты.
В базе данных Identity server он использует электронную почту для уникальной идентификации пользователей. Пытаться очистка данных таблицы пользователей, если это возможно, вместе с ролями. Если выше не сработало.
А как же Ид? Можете ли вы проверить таблицу ролей на наличие существующего идентификатора пользователя? @FadoBagi
В таблице AspNetRoles создана тестовая роль. Но новых данных нет ни в AspNetUser, ни в AspNetUserRoles.
Я предполагаю, что создание пользователя таким образом создает для него уникальный идентификатор.
Да, вы можете попробовать переключить последние две строки await userManager.AddToRoleAsync(user, role.Name); await userManager.CreateAsync(user, testPassword);
Все остается прежним после изменения двух строк.
По сути, это нарушение ограничения внешнего ключа между AspNetUserRoles и AspNetUsers_UserId. Трудно сказать, глядя на высокий уровень. лучше, если вы можете поделиться снимками классов и таблиц для каждой таблицы
Таблицы стандартные. Я не трогал ничего, связанного с id.
Проблема была в данных, которые я создавал для нового пользователя. Пароль недействителен в соответствии с ограничениями пароля, установленными в службах. Пароль test123
не содержит заглавных букв и не буквенно-цифровых символов, которые требуются по умолчанию. Изменение его на Test123+
решило проблему.
Установленные мной фиктивные пользовательские данные уникальны для данных в базе данных. Другого пользователя с таким адресом электронной почты или именем пользователя нет.