Не удается создать и предоставить роль пользователю в Program.cs

Проект 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>();
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Судя по ошибке, кажется, что вы пытаетесь создать пользователя с тем же идентификатором, адресом электронной почты и т. д., что приводит к тому, что пользователь является экземпляром одного и того же пользователя. Добавление роли для того же пользователя вызывает ошибку, поскольку у пользователя уже есть роль. Вы должны попытаться создать пользователя с другим адресом электронной почты.

В базе данных Identity server он использует электронную почту для уникальной идентификации пользователей. Пытаться очистка данных таблицы пользователей, если это возможно, вместе с ролями. Если выше не сработало.

Установленные мной фиктивные пользовательские данные уникальны для данных в базе данных. Другого пользователя с таким адресом электронной почты или именем пользователя нет.

FadoBagi 27.11.2022 12:45

А как же Ид? Можете ли вы проверить таблицу ролей на наличие существующего идентификатора пользователя? @FadoBagi

Selaka Nanayakkara 27.11.2022 12:46

В таблице AspNetRoles создана тестовая роль. Но новых данных нет ни в AspNetUser, ни в AspNetUserRoles.

FadoBagi 27.11.2022 12:56

Я предполагаю, что создание пользователя таким образом создает для него уникальный идентификатор.

FadoBagi 27.11.2022 13:02

Да, вы можете попробовать переключить последние две строки await userManager.AddToRoleAsync(user, role.Name); await userManager.CreateAsync(user, testPassword);

Selaka Nanayakkara 27.11.2022 13:05

Все остается прежним после изменения двух строк.

FadoBagi 27.11.2022 13:09

По сути, это нарушение ограничения внешнего ключа между AspNetUserRoles и AspNetUsers_UserId. Трудно сказать, глядя на высокий уровень. лучше, если вы можете поделиться снимками классов и таблиц для каждой таблицы

Selaka Nanayakkara 27.11.2022 13:15

Таблицы стандартные. Я не трогал ничего, связанного с id.

FadoBagi 27.11.2022 13:25
Ответ принят как подходящий

Проблема была в данных, которые я создавал для нового пользователя. Пароль недействителен в соответствии с ограничениями пароля, установленными в службах. Пароль test123 не содержит заглавных букв и не буквенно-цифровых символов, которые требуются по умолчанию. Изменение его на Test123+ решило проблему.

Другие вопросы по теме