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)
Entity Framework Core 是否为此内置了一些东西?
我应该IValidatableObject以某种方式实现接口吗?
Configuration类是否应该关注其实体的验证?
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 而言,这也无关紧要。
| 归档时间: |
|
| 查看次数: |
3074 次 |
| 最近记录: |