Написание аннотации данных диапазона с помощью Fluent API в Entity Framework Core - PullRequest
0 голосов
/ 15 марта 2019

Описание

Поскольку я пытаюсь принять Чистая архитектура , я хочу отойти от Аннотации данных и использовать Свободный API который, лично я начал отдавать предпочтение гораздо большему.

Однако я не слишком квалифицирован в этом способе реализации вещей.

Range Annotation (Старый подход)

Ранее я использовал аннотацию Range для указания min и max для числовых свойств, например:

public class Engine
{
    ...

    [Range(0, 10000)]
    public int Size { get; set; }

    [Display(Name = "Horse power")]
    [Range(0, 1000)]
    public int HorsePower { get; set; }

    [Display(Name = "Top speed")]
    [Range(0, 500)]
    public int? TopSpeed { get; set; }

    ...
}

Класс конфигурации(Более чистый подход)

Теперь я пытаюсь написать проверочный код в классе Configuration , связанном с сущностью Engine.

Сущность класс:

public class Engine
{
    public int EngineId { get; set; }
    public int Size { get; set; }
    public int HorsePower { get; set; }
    public int? TopSpeed { get; set; }
    public int FuelId { get; set; }
    public int TransmissionId { get; set; }
}

Это то, что у меня сейчас есть для класса конфигурации :

using Carsurfer.Domain.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Carsurfer.Persistence.Configurations
{
    public class EngineConfiguration : IEntityTypeConfiguration<Engine>
    {
        public void Configure(EntityTypeBuilder<Engine> builder)
        {
            builder.Property(engine => engine.Size);
        }
    }
}

Вопросы

  1. Есть ли что-то встроенное в Entity Framework Core для этого?

  2. Должен ли я реализовать интерфейс IValidatableObjectomehow?

  3. Должен ли класс Configuration быть связан с проверкой его сущности?

1 Ответ

1 голос
/ 16 марта 2019

Есть ли что-то встроенное в Entity Framework Core для этого?

Насколько мне известно, Fluent API не эквивалентен RangeAttribute.

Должен ли я как-то реализовать интерфейс IValidatableObject?

Реализация IValidatableObject не позволит вам использовать Fluent API для RangeAttribute.Вам все равно придется использовать атрибуты DataAnnotation.

Должен ли класс Configuration быть связан с проверкой его сущности?

IEntityTypeConfiguration предназначен для обеспечениячистый способ разделения вашей конфигурации DbModel для использования EntityFrameworkCore.Поэтому обычно такой класс конфигурации будет содержать настройку и проверку уровня схемы (ограничения, максимальные значения, реляционная конфигурация (где это необходимо)).

Вопрос, который вам нужно задать себе, - почему вы даже используете RangeAttribute впервое место.Это не имеет никакого эффекта схемы.Вы можете использовать его, потому что вы также используете свои классы сущностей для MVC во встроенной проверке.Если это так, и вы разделяете классы вашей сущности (POCO) вместо того, чтобы иметь отдельные классы для ваших ViewModels или Dto, то вам нужно будет просто использовать гибридную версию, где вы разделяете аннотации данных, которые относятся к EF Core, на классы IEntityTypeConfiguration и оставляетеаннотации данных, предназначенные для проверки MVC в качестве атрибутов.Стоит отметить, что DisplayNameAttribute также не имеет отношения к EF Core.

...