Как исправить ошибки SqliteException: SQLite Error 19: 'UNIQUE constraint failed: AspNetUsers.NormalizedUserName' и DbUpdateException?
Сущности:
public class Review { [Key, Required] public int ReviewId { get; set; } [Required] public int RecipeId { get; set; } [Required] public Recipe Recipe { get; set; } [Required] public string Comment { get; set; } [Range(1, 10)] public int Estimation { get; set; } [Required] public string UserId { get; set; } public User User { get; set; } } public class User : IdentityUser { public List<Recipe> Recipes { get; set; } public List<Review> Reviews { get; set; } } |
public class Review { [Key, Required] public int ReviewId { get; set; } [Required] public int RecipeId { get; set; } [Required] public Recipe Recipe { get; set; } [Required] public string Comment { get; set; } [Range(1, 10)] public int Estimation { get; set; } [Required] public string UserId { get; set; } public User User { get; set; } } public class User : IdentityUser { public List<Recipe> Recipes { get; set; } public List<Review> Reviews { get; set; } }
Код обработчика страницы отвечающий за создание рецепта:
public async Task<IActionResult> OnPost() { var owner = await _userManager.GetUserAsync(User); var recipe = new Recipe { Name = BindingModel.Name, Discription = BindingModel.Discription, CookingMinutesTime = BindingModel.CookingMinutesTime, CookingSteps = BindingModel.CookingSteps, ChangeVersion = 0, UserId = owner.Id, User = owner}; using ApplicationDbContext db = new(); db.Recipes.Add(recipe); db.SaveChanges(); if (recipe == null) return NotFound(); return RedirectToPage("RecipePage", "OnGet", new { id = recipe.RecipeId }); } |
public async Task<IActionResult> OnPost() { var owner = await _userManager.GetUserAsync(User); var recipe = new Recipe { Name = BindingModel.Name, Discription = BindingModel.Discription, CookingMinutesTime = BindingModel.CookingMinutesTime, CookingSteps = BindingModel.CookingSteps, ChangeVersion = 0, UserId = owner.Id, User = owner}; using ApplicationDbContext db = new(); db.Recipes.Add(recipe); db.SaveChanges(); if (recipe == null) return NotFound(); return RedirectToPage("RecipePage", "OnGet", new { id = recipe.RecipeId }); }
внимание на вот этот фрагмент кода UserId = owner.Id, User = owner};, чтобы создать связь между юзером и рецептом достаточно всего свойству указать значение. У меня когда я оставляю просто UserId = owner.Id все работает нормально. Но я хочу юзать навигационное свойство, потому пишу User = owner, и вот тут начинается все. Проблема появляеться из за NormalizedUserName.
Из за чего SqliteException: SQLite Error 19: 'UNIQUE constraint failed: AspNetUsers.NormalizedUserName' и DbUpdateException появляються?
Дополнительно:
Посмотрите в структуре базы данных SQLite какое ограничение накладывает AspNetUsers.NormalizedUserName.
Длина значения, можно null/нельзя null значение.
не пишите User = owner, это навигационное свойство, оно не хранится в базе, для связи достаточно UserId выставить. В вашем случае EF добавляет еще и юзера, а так ка он уже есть, отсюда и ошибка.
https://learn.microsoft.com/en-us/ef/core/saving/r...
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для решения ошибки SQLiteException: SQLite Error 19: 'UNIQUE constraint failed: AspNetUsers.NormalizedUserName' и DbUpdateException, можно принять следующие шаги:
1. Проверьте уникальность значения поля NormalizedUserName в таблице AspNetUsers. Ошибка указывает на то, что попытка добавить дублирующееся значение в это поле. Убедитесь, что значение, которое вы пытаетесь добавить, не совпадает с уже существующими значениями.
2. Проверьте наличие индексов на таблице AspNetUsers. Индексы могут помочь предотвратить появление дублирующихся значений и ускорить выполнение запросов. Убедитесь, что индексы настроены правильно для поля NormalizedUserName.
3. Проверьте код, который выполняет операции с базой данных. Убедитесь, что перед вставкой новых данных в таблицу AspNetUsers вы проверяете наличие существующих записей с таким же значением NormalizedUserName.
4. Обработайте исключения правильным образом. Для DbUpdateException убедитесь, что вы обрабатываете исключение и выводите соответствующее сообщение об ошибке пользователю. Также можно добавить логирование для отслеживания возможных проблем.
Пример кода на языке программирования C# с использованием Entity Framework для работы с базой данных:
try { // Код для добавления новой записи в таблицу AspNetUsers } catch (DbUpdateException ex) { // Обработка исключения Console.WriteLine("Ошибка при обновлении базы данных: " + ex.Message); }
Следуя этим шагам, вы сможете исправить ошибку SQLiteException: SQLite Error 19 и избежать появления DbUpdateException в вашем приложении.