Аннотации данных или Fluent API? Лучшие практики для поддержки различных ORM

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

В настоящее время я изучаю, будет ли Fluent API (в настоящее время тестируется разновидность EF Core) облегчать эту функциональность, или мне нужно рассмотреть возможность добавления аннотаций данных в мою модель уровня данных, чтобы гарантировать, что проверка может быть реализована во всех службах объектно-реляционного моделирования.

Судя по чтению в Интернете, Fluent API — лучший способ действий, поскольку он снимает рабочую нагрузку с уровня данных и позволяет уровню доступа к данным контролировать и указывать конкретные правила, касающиеся того, как будут моделироваться данные.

Недостатком является то, что мне нужно будет повторно реализовать это для других ORM (например, NPoco), чтобы соответствовать правилам этой платформы.

Еще немного о проблеме

У меня есть несколько классов, которые будут иметь имена и строки с иностранными культурами, и их можно идентифицировать по строке языковой культуры, используя комбинацию ISO-639 и ISO-3166. (en-GB, zh-CN)

Это представлено строкой в ​​модели данных.

public abstract class Alias
{
    public string Culture { get; set; }
}

В EF Core я настроил таблицы с помощью функции OnModelCreating.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    var authorAlias = modelBuilder.Entity<AuthorAlias>();
    authorAlias.Property("Given").IsRequired().IsUnicode();
    authorAlias.Property("Family").IsRequired().IsUnicode();
    authorAlias.Property("Middle").IsUnicode();

    base.OnModelCreating(modelBuilder);
}

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

Как я могу гарантировать, что моя предполагаемая логика может быть реализована в системе? И нужно ли мне переходить на аннотации данных, чтобы обеспечить эту логику?


person Community    schedule 03.04.2018    source источник
comment
Вы ищете что-то подобное? Проверка в EF Core   -  person bricelam    schedule 05.04.2018
comment
Вроде того, но для использования IValidateObject требуется использование аннотации данных. Аннотации данных — это то, чего я хотел бы избежать, поэтому, возможно, мне придется использовать другой подход. Возможно, используя пользовательский интерфейс, который будет выполнять проверку модели напрямую, прежде чем она попадет в базу данных. Поскольку я планирую разрешить использование различных ORM, возможно, будет безопаснее не использовать проверку на уровне доступа...   -  person    schedule 06.04.2018


Ответы (1)


Это может быть поздний ответ, но можете ли вы использовать «Fluent Validation» — популярную библиотеку .NET для создания строго типизированных правил проверки.

  1. Установите пакет Nuget dotnet, добавьте пакет FluentValidation.AspNetCore.

  2. Создайте валидатор модели, как показано ниже, который расширяет «AbstractValidator» и создает правила по мере необходимости.

    public class Employee
    {
        public string Name { get; set; }
        public string EmployeeId { get; set; }
    
    }
    
    public class EmployeeValidator:AbstractValidator<Employee>
    {
        public EmployeeValidator()
        {
            RuleFor(x => x.Name).NotEmpty().WithMessage("Employee Name can not be 
                    empty");
    
            RuleFor(x => x.EmployeeId).NotEmpty();  
        }
    }
    
  3. FluentValidation поддерживает интеграцию с ASP.NET Core 2.1 или 3.1 (рекомендуется 3.1). После включения MVC будет использовать FluentValidation для проверки объектов, которые передаются в действия контроллера инфраструктурой привязки модели.

Дополнительную информацию о том, как это можно использовать для ASP.NET CORE, можно найти здесь — https://docs.fluentvalidation.net/en/latest/aspnet.html

person RashmiMs    schedule 24.01.2021