FluentValidation Проверка дублирующихся значений с БД - PullRequest
0 голосов
/ 04 мая 2020

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

Как мне сделать это с помощью Fluent Validation?

У меня есть пробовал это , но возникли некоторые ошибки.

Это мой текущий код:

RuleFor
(x => x.Name)
.NotEmpty().WithMessage("The name cannot be empty!");

Пример для БД (пользователя) будет:

Имя, возраст

Имя не должно дублироваться.

1 Ответ

0 голосов
/ 04 мая 2020

В указанной ссылке они дают подходящее решение. Однако я предлагаю вам использовать шаблоны проектирования (например, шаблон репозитория) и принципы (например, внедрение зависимости). Один из способов выполнить необходимую проверку (без дубликатов имен):

  1. Определить интерфейс репозитория и метод для получения ваших данных из базы данных:

    public interface IMyClassToValidateRepository {
        Task<IList<MyClassToValidate>> GetDataAsync();
    }
    
  2. В вашем классе валидатора передайте объект репозитория в его конструктор (этот объект будет решен путем внедрения зависимости). Затем определите свою валидацию следующим образом (посмотрите, что я использую асинхронные c методы. Если вам не нужны асинхронные методы, вам нужно будет конвертировать их в синхронную версию):

    public class MyClassToValidateValidator : AbstractValidator<MyClassToValidate> {
        public MyClassToValidateValidator(IMyClassToValidateRepository repository) {
            RuleFor(x => x.Name)
                .MustAsync(async (name, ct) => 
                    (await repository.GetDataAsync()).All(x => x.Name != name));
        }
    }
    

Класс, который я использовал как пример:

public class MyClassToValidate {
    public string Name { get; set; }
}
...