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

#c# #sqlite #asp.net-core

#c# #sqlite #asp.net-core

Вопрос:

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

Я поместил уникальный индекс в поля имени пользователя ( Nom ) и электронной почты ( Mail ) при создании базы данных в моем контексте :

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     modelBuilder.Entity<Utilisateur>().HasIndex(u => u.Nom).IsUnique();
     modelBuilder.Entity<Utilisateur>().HasIndex(u => u.Mail).IsUnique();
     modelBuilder.Entity<Utilisateur>().ToTable("tblUtilisateur");
}
  

Вот Utilisateur класс:

 using System.ComponentModel.DataAnnotations;

namespace Clavardage.Models
{
    public class Utilisateur
    {
        public string Pseudo { get; set; }

        [Required]
        public string Nom { get; set; }

        [Required]
        [MinLength(6)]
        public string Mdp { get; set; }

        [Required]
        public string Mail { get; set; }
    }
}
  

На данный момент мои поля фактически уникальны, но когда я ввожу неуникальное имя пользователя или адрес электронной почты, я получаю эту страницу с ошибкой :

введите описание изображения здесь

Есть ли способ просто отправить сообщение пользователю как ASP.NET Ядро делает это самостоятельно для [Required] или [MinLength(6)] с asp-valifation-for тегом?

введите описание изображения здесь

Ответ №1:

Вы можете перехватить исключение и добавить ошибку в словарь ModelState

 try
{
    // Perform database update here
}
catch (DbUpdateException ex)
{
    if (ex.InnerException is SqliteException sqliteException)
    {
        // Parse the error and check that it matches Unique constraint error
        var regex = new Regex("UNIQUE constraint failed: (?<tbl>\w )\.(?<col>\w )");
        var match = regex.Match(sqliteException.Message);
        if (match.Success)
        {
            // Get the column name that caused the failure failed 
            var col = match.Groups["col"].Value;
            // Add an error to the ModelState dictionary
            ModelState.AddModelError(col, $"{col} must be unique");
            return View();
        }
    }
    // Another exception happened which we don't know how to handle to we rethrow.
    throw;
}
  

Однако этот код специфичен для SQLLite (поскольку ваша ошибка показала, что это используемая вами база данных).

Комментарии:

1. Спасибо за ваш ответ, кажется, это работает. Я просто не понимаю, что должна делать строка return View() . Visual Studio указывает на это как на ошибку, и я не могу заставить его работать с ней.