#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 указывает на это как на ошибку, и я не могу заставить его работать с ней.