Инструкция INSERT конфликтует с идентификатором ограничения FOREIGN KEY AspNetUsers(IdentityUser) в ASP.NET Core MVC. ⇐ C#
Инструкция INSERT конфликтует с идентификатором ограничения FOREIGN KEY AspNetUsers(IdentityUser) в ASP.NET Core MVC.
Я создал панель регистрации для врача, пациента и администратора, когда я пытаюсь зарегистрировать или вставить данные, выдает такую ошибку,
SqlException: инструкция INSERT конфликтует с ограничением FOREIGN KEY «FK_AspNetUsers_Departments_DepartmentId». Конфликт произошел в базе данных «Hospitaldb», таблица «dbo.Departments», столбец «Id»
Часть миграции:
migrationBuilder.CreateTable( имя: «Аспнетусерс», столбцы: таблица => новый { Id = table.Column(тип: «nvarchar(450)», значение NULL: false), Дискриминатор = table.Column(тип: «nvarchar(21)», maxLength: 21, обнуляемый: false), Имя пользователя = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), NormalizedUserName = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), Электронная почта = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), NormalizedEmail = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), EmailConfirmed = table.Column(тип: «бит», значение null: false), PasswordHash = table.Column(тип: «nvarchar(max)», значение NULL: true), SecurityStamp = table.Column(тип: «nvarchar(max)», значение NULL: true), ConcurrencyStamp = table.Column(тип: «nvarchar(max)», значение NULL: true), PhoneNumber = table.Column(тип: «nvarchar(max)», значение NULL: true), PhoneNumberConfirmed = table.Column(тип: «бит», значение null: false), TwoFactorEnabled = table.Column(тип: «бит», значение null: false), LockoutEnd = table.Column(тип: «datetimeoffset», значение NULL: true), LockoutEnabled = table.Column(тип: «бит», значение null: false), AccessFailedCount = table.Column(тип: «int», значение null: false), // Я добавил эту строку DepartmentId = table.Column(тип: «int», значение null: true) }, ограничения: таблица => { table.PrimaryKey("PK_AspNetUsers", x => x.Id); // Я добавил этот блок кода таблица.ForeignKey( имя: "FK_AspNetUsers_Departments_DepartmentId", столбец: x => x.DepartmentId, PrincipalTable: «Отделы», PrincipalColumn: «Идентификатор», onDelete: ReferentialAction.Cascade); }); } Класс модели отдела:
Отдел общественного класса { общественный ИНТ Id {получить; набор; } общедоступная строка Имя {get; набор; } общедоступная строка Описание {get; набор; } public ICollection Сотрудники {get; набор; } } DbInitializer, который наследуется от IDbInitializer:
public void Initialize() { пытаться { если (_context.Database.GetPendingMigrations().Count() > 0) { _context.Database.Migrate(); } } поймать (исключение) { бросать; } if (!_roleManager.RoleExistsAsync(WebsiteRoles.Website_Admin).GetAwaiter().GetResult()) { _roleManager.CreateAsync(новая IdentityRole(WebsiteRoles.Website_Admin)).GetAwaiter().GetResult(); _roleManager.CreateAsync(новая IdentityRole(WebsiteRoles.Website_Patient)).GetAwaiter().GetResult(); _roleManager.CreateAsync(новая IdentityRole(WebsiteRoles.Website_Doctor)).GetAwaiter().GetResult(); _userManager.CreateAsync(новый ApplicationUser { Имя пользователя = "XYZ", Электронная почта = "[email protected]" }, "XYZ@123").GetAwaiter().GetResult(); var Appuser = _context.ApplicationUsers.FirstOrDefault(x => x.Email == "[email protected]"); если (Appuser != ноль) { _userManager.AddToRoleAsync(Appuser, WebsiteRoles.Website_Admin).GetAwaiter().GetResult(); } } } Класс ApplicationUser:
публичный класс ApplicationUser: IdentityUser { общедоступная строка Имя {get; набор; } общественный Пол Пол { get; набор; } публичная строка Национальность {get; набор; } общедоступная строка Адрес {get; набор; } общественный DateTime DOB {получить; набор; } Специалист по общедоступной строке { get; набор; } общественный bool IsDoctor {получить; набор; } общественная строка PictureUrl {get; набор; } отдел государственного департамента { get; набор; } [NotMapped] общественный ICollection Назначения {get; набор; } [NotMapped] public ICollection Расчеты заработной платы {get; набор; } [NotMapped] общественный ICollection PatientReports {get; набор; } } Файл DoctorRegister.cs IdentityUser:
публичная асинхронная задача OnPostAsync (строка returnUrl = null) { returnUrl ??= Url.Content("~/"); Внешний вход = (ожидание _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); если (ModelState.IsValid) { вар пользователь = CreateUser(); ждут _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); ждут _emailStore.SetEmailAsync(пользователь, Input.Email, CancellationToken.None); пользователь.Имя = Ввод.Имя; пользователь.Адрес = Вход.Адрес; user.Nationality = Input.Nationality; пользователь.DOB = Ввод.DOB; пользователь.Пол = Ввод.Пол; пользователь.IsDoctor = Input.IsDoctor; пользователь.Специалист = Вход.Специалист; ImageOpertaions изображение = новый ImageOpertaions (_env); строковое имя файла = image.ImageUpload(Input.PictureUrl); user.PictureUrl = имя файла; результат вар = ждут _userManager.CreateAsync(пользователь, Input.Password); если (результат.Успешно) { _logger.LogInformation("Пользователь создал новую учетную запись с паролем."); ждут _userManager.AddToRoleAsync(пользователь, WebsiteRoles.Website_Doctor); вар userId = ждут _userManager.GetUserIdAsync (пользователь); //код var = ожидание _userManager.GenerateEmailConfirmationTokenAsync(user); //код = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(код)); //var callbackUrl = Url.Page( // "/Учетная запись/ConfirmEmail", // обработчик страницы: ноль, // значения: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, // протокол: Request.Scheme); //ждем _emailSender.SendEmailAsync(Input.Email, «Подтвердите свой адрес электронной почты», // $"Подтвердите свою учетную запись, нажав здесь."); если (_userManager.Options.SignIn.RequireConfirmedAccount) { return RedirectToPage("RegisterConfirmation", новый {электронная почта = Input.Email, returnUrl = returnUrl}); } еще { ждут _signInManager.SignInAsync (пользователь, isPersistent: false); вернуть LocalRedirect (returnUrl); } } foreach (ошибка var в result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // Если мы зашли так далеко, что-то не удалось, переотобразите форму вернуть страницу(); } Метод CreateUser:
частный ApplicationUser CreateUser() { пытаться { return Activator.CreateInstance(); } ловить { throw new InvalidOperationException($"Невозможно создать экземпляр '{nameof(IdentityUser)}'. " + $"Убедитесь, что '{nameof(IdentityUser)}' не является абстрактным классом и имеет конструктор без параметров, или, альтернативно, " + $"переопределить страницу регистрации в /Areas/Identity/Pages/Account/Register.cshtml"); } } Когда я отлаживаю код, после этой строки выдается ошибка
var result = await _userManager.CreateAsync(user, Input.Password); Я пытаюсь вставить строку данных в базу данных, используя внешний ключ, но получаю сообщение об ошибке при отправке идентификатора ограничения FOREIGN KEY
В базе данных уже существует одна запись, которую я жестко запрограммировал
Я создал панель регистрации для врача, пациента и администратора, когда я пытаюсь зарегистрировать или вставить данные, выдает такую ошибку,
SqlException: инструкция INSERT конфликтует с ограничением FOREIGN KEY «FK_AspNetUsers_Departments_DepartmentId». Конфликт произошел в базе данных «Hospitaldb», таблица «dbo.Departments», столбец «Id»
Часть миграции:
migrationBuilder.CreateTable( имя: «Аспнетусерс», столбцы: таблица => новый { Id = table.Column(тип: «nvarchar(450)», значение NULL: false), Дискриминатор = table.Column(тип: «nvarchar(21)», maxLength: 21, обнуляемый: false), Имя пользователя = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), NormalizedUserName = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), Электронная почта = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), NormalizedEmail = table.Column(тип: «nvarchar(256)», maxLength: 256, значение NULL: true), EmailConfirmed = table.Column(тип: «бит», значение null: false), PasswordHash = table.Column(тип: «nvarchar(max)», значение NULL: true), SecurityStamp = table.Column(тип: «nvarchar(max)», значение NULL: true), ConcurrencyStamp = table.Column(тип: «nvarchar(max)», значение NULL: true), PhoneNumber = table.Column(тип: «nvarchar(max)», значение NULL: true), PhoneNumberConfirmed = table.Column(тип: «бит», значение null: false), TwoFactorEnabled = table.Column(тип: «бит», значение null: false), LockoutEnd = table.Column(тип: «datetimeoffset», значение NULL: true), LockoutEnabled = table.Column(тип: «бит», значение null: false), AccessFailedCount = table.Column(тип: «int», значение null: false), // Я добавил эту строку DepartmentId = table.Column(тип: «int», значение null: true) }, ограничения: таблица => { table.PrimaryKey("PK_AspNetUsers", x => x.Id); // Я добавил этот блок кода таблица.ForeignKey( имя: "FK_AspNetUsers_Departments_DepartmentId", столбец: x => x.DepartmentId, PrincipalTable: «Отделы», PrincipalColumn: «Идентификатор», onDelete: ReferentialAction.Cascade); }); } Класс модели отдела:
Отдел общественного класса { общественный ИНТ Id {получить; набор; } общедоступная строка Имя {get; набор; } общедоступная строка Описание {get; набор; } public ICollection Сотрудники {get; набор; } } DbInitializer, который наследуется от IDbInitializer:
public void Initialize() { пытаться { если (_context.Database.GetPendingMigrations().Count() > 0) { _context.Database.Migrate(); } } поймать (исключение) { бросать; } if (!_roleManager.RoleExistsAsync(WebsiteRoles.Website_Admin).GetAwaiter().GetResult()) { _roleManager.CreateAsync(новая IdentityRole(WebsiteRoles.Website_Admin)).GetAwaiter().GetResult(); _roleManager.CreateAsync(новая IdentityRole(WebsiteRoles.Website_Patient)).GetAwaiter().GetResult(); _roleManager.CreateAsync(новая IdentityRole(WebsiteRoles.Website_Doctor)).GetAwaiter().GetResult(); _userManager.CreateAsync(новый ApplicationUser { Имя пользователя = "XYZ", Электронная почта = "[email protected]" }, "XYZ@123").GetAwaiter().GetResult(); var Appuser = _context.ApplicationUsers.FirstOrDefault(x => x.Email == "[email protected]"); если (Appuser != ноль) { _userManager.AddToRoleAsync(Appuser, WebsiteRoles.Website_Admin).GetAwaiter().GetResult(); } } } Класс ApplicationUser:
публичный класс ApplicationUser: IdentityUser { общедоступная строка Имя {get; набор; } общественный Пол Пол { get; набор; } публичная строка Национальность {get; набор; } общедоступная строка Адрес {get; набор; } общественный DateTime DOB {получить; набор; } Специалист по общедоступной строке { get; набор; } общественный bool IsDoctor {получить; набор; } общественная строка PictureUrl {get; набор; } отдел государственного департамента { get; набор; } [NotMapped] общественный ICollection Назначения {get; набор; } [NotMapped] public ICollection Расчеты заработной платы {get; набор; } [NotMapped] общественный ICollection PatientReports {get; набор; } } Файл DoctorRegister.cs IdentityUser:
публичная асинхронная задача OnPostAsync (строка returnUrl = null) { returnUrl ??= Url.Content("~/"); Внешний вход = (ожидание _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); если (ModelState.IsValid) { вар пользователь = CreateUser(); ждут _userStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); ждут _emailStore.SetEmailAsync(пользователь, Input.Email, CancellationToken.None); пользователь.Имя = Ввод.Имя; пользователь.Адрес = Вход.Адрес; user.Nationality = Input.Nationality; пользователь.DOB = Ввод.DOB; пользователь.Пол = Ввод.Пол; пользователь.IsDoctor = Input.IsDoctor; пользователь.Специалист = Вход.Специалист; ImageOpertaions изображение = новый ImageOpertaions (_env); строковое имя файла = image.ImageUpload(Input.PictureUrl); user.PictureUrl = имя файла; результат вар = ждут _userManager.CreateAsync(пользователь, Input.Password); если (результат.Успешно) { _logger.LogInformation("Пользователь создал новую учетную запись с паролем."); ждут _userManager.AddToRoleAsync(пользователь, WebsiteRoles.Website_Doctor); вар userId = ждут _userManager.GetUserIdAsync (пользователь); //код var = ожидание _userManager.GenerateEmailConfirmationTokenAsync(user); //код = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(код)); //var callbackUrl = Url.Page( // "/Учетная запись/ConfirmEmail", // обработчик страницы: ноль, // значения: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl }, // протокол: Request.Scheme); //ждем _emailSender.SendEmailAsync(Input.Email, «Подтвердите свой адрес электронной почты», // $"Подтвердите свою учетную запись, нажав здесь."); если (_userManager.Options.SignIn.RequireConfirmedAccount) { return RedirectToPage("RegisterConfirmation", новый {электронная почта = Input.Email, returnUrl = returnUrl}); } еще { ждут _signInManager.SignInAsync (пользователь, isPersistent: false); вернуть LocalRedirect (returnUrl); } } foreach (ошибка var в result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } // Если мы зашли так далеко, что-то не удалось, переотобразите форму вернуть страницу(); } Метод CreateUser:
частный ApplicationUser CreateUser() { пытаться { return Activator.CreateInstance(); } ловить { throw new InvalidOperationException($"Невозможно создать экземпляр '{nameof(IdentityUser)}'. " + $"Убедитесь, что '{nameof(IdentityUser)}' не является абстрактным классом и имеет конструктор без параметров, или, альтернативно, " + $"переопределить страницу регистрации в /Areas/Identity/Pages/Account/Register.cshtml"); } } Когда я отлаживаю код, после этой строки выдается ошибка
var result = await _userManager.CreateAsync(user, Input.Password); Я пытаюсь вставить строку данных в базу данных, используя внешний ключ, но получаю сообщение об ошибке при отправке идентификатора ограничения FOREIGN KEY
В базе данных уже существует одна запись, которую я жестко запрограммировал
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
SqlException: инструкция INSERT конфликтует с ограничением FOREIGN KEY – asp.net-core
Anonymous » » в форуме C# - 0 Ответы
- 37 Просмотры
-
Последнее сообщение Anonymous
-