Как исправить ошибки SqliteException: SQLite Error 19: 'UNIQUE constraint failed: AspNetUsers.NormalizedUserName' и DbUpdateException?

Ссылка скопирована
1 ответ

Сущности:

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?

Из за чего 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...

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

Для решения ошибки 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);
}

try { // Код для добавления новой записи в таблицу AspNetUsers } catch (DbUpdateException ex) { // Обработка исключения Console.WriteLine("Ошибка при обновлении базы данных: " + ex.Message); }

Следуя этим шагам, вы сможете исправить ошибку SQLiteException: SQLite Error 19 и избежать появления DbUpdateException в вашем приложении.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно