在 Entity Framework Core 中使用 Fluent API 编写范围数据注释

Dan*_*ber 1 c# data-annotations entity-framework-core asp.net-core clean-architecture

描述

当我尝试采用Clean Architecture 时,我想摆脱数据注释并使用Fluent API,就我个人而言,我开始更喜欢它。

但是,我不太擅长这种实现方式。

范围注释(旧方法)

我之前所做的是使用Range注释为数字属性指定最小值最大值,如下所示:

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; }

    ...
}
Run Code Online (Sandbox Code Playgroud)

配置类(更清洁的方法)

现在,我正在尝试在与实体关联的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; }
}
Run Code Online (Sandbox Code Playgroud)

这是我目前为Configuration 类所拥有的

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

  1. Entity Framework Core 是否为此内置了一些东西?

  2. 我应该IValidatableObject以某种方式实现接口吗?

  3. Configuration类是否应该关注其实体的验证

Vid*_*ius 6

Entity Framework Core 是否为此内置了一些东西?

RangeAttribute我所知,没有 Fluent API 等同于我的知识。

我应该以某种方式实现 IValidatableObject 接口吗?

实施IValidatableObject不会使您能够将 Fluent API 用于RangeAttribute. 您仍然必须使用DataAnnotation属性。

Configuration 类是否应该关注其实体的验证?

IEntityTypeConfiguration旨在提供一种干净的方式来分离您的DbModel配置以EntityFrameworkCore供使用。所以通常这样的配置类将包含模式级别的设置和验证(约束、最大值、关系配置(在适当的地方))。

您需要问自己的问题是,为什么您甚至RangeAttribute首先使用。它对模式没有任何影响。您可能会使用它,因为您还在内置验证中将实体类用于 MVC。如果是这种情况,并且您共享实体 (POCO) 类而不是为 ViewModel 或 Dto 使用单独的类,那么您将只需要使用混合版本,将与 EF Core 相关的数据注释分离到IEntityTypeConfiguration类中并留下数据注释用于 MVC 验证目的作为属性。值得注意的DisplayNameAttribute是,就 EF Core 而言,这也无关紧要。