如何使用 Fluent Validation 针对 Entity Framework 核心字段属性进行验证

How to Validate against Entity Framework Core Field Properties with Fluent Validation

我正在尝试根据 Entity Framework 核心的 .HasMaxLength 属性 进行验证。

这是一个示例模型构建器方法:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
             {
              modelBuilder.Entity<Address>(entity =>
                 {
              
                  entity.Property(e => e.AddressEmail)
                .IsRequired()
                .HasMaxLength(255)
                .IsUnicode(false)
                .HasDefaultValueSql("('')");

使用我的上下文,我可以找到这样的最大长度:

  dbContext.Model.FindEntityType(typeof(Address)).FindProperty("AddressEmail").GetMaxLength()

使用 Fluent Validation,我可以这样做:

  RuleFor(Address => Address.AddressEmail).NotNull().MaximumLength(255);

这样可行,但是当我更改数据库结构时,我必须更新我的验证器。

我正在尝试找出如何从 entity framework MaxLength 属性

驱动我的 Fluent 验证规则

如有任何帮助,我们将不胜感激。

**** 引入 dbcontext 的部分工作方式,但我仍在努力获取规则:

 public AddressValidator(DbContext dbContext)
      {
        Microsoft.EntityFrameworkCore.Metadata.IEntityType et = dbContext.Model.FindEntityType(typeof(Address));

        foreach (var Property in et.GetProperties())
        {
            var maxLength = Property.GetMaxLength();
  ---->>>>> RuleFor(x =>x.{PropertyName})    Invalid but this is the idea
        }
            

您可以使用之前提供的代码将数据库上下文注入验证器。不确定是否有自动执行此操作的适配器

class MyClassValidator : AbstractValidator<MyClass>
{
    public MyClassValidator(MyDbContext dbContext)
    {
        var maxLength = dbContext.Model.FindEntityType(typeof(MyClass))
            .FindProperty(nameof(MyClass.Data)).GetMaxLength();

        RuleFor(x => x.Data)
            .MaximumLength(maxLength.Value);
    }
}

更新

使用表达式的版本

class MyClassValidator : AbstractValidator<MyClass>
{
    public MyClassValidator(MyDbContext dbContext)
    {
        var entityType = dbContext.Model.FindEntityType(typeof(MyClass));

        foreach (var property in typeof(MyClass).GetProperties()
            .Where(x => x.PropertyType == typeof(string)))
        {
            var maxLength = entityType
                .FindProperty(property.Name)
                .GetMaxLength();

            if (maxLength.HasValue) 
            {
                var parameter = Expression.Parameter(typeof(MyClass));
                var memberExpression = Expression.Property(parameter, property.Name);
                var lambdaExpression = Expression.Lambda<Func<MyClass, string>>(memberExpression, parameter);

                RuleFor(lambdaExpression)
                    .MaximumLength(maxLength.Value);
            }
        }

    }
}