如何使用 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);
}
}
}
}
我正在尝试根据 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);
}
}
}
}