gpt4 book ai didi

c# - 用于检查数据库中是否存在实体的 FluentValidator 扩展方法

转载 作者:行者123 更新时间:2023-12-05 06:24:43 27 4
gpt4 key购买 nike

我有一个很常见的情况,我需要在给定实体中设置引用属性时进行验证。发生这种情况时,我会这样验证:

public class Validator : AbstractValidator<Command>
{
public Validator()
{
...

RuleFor(user => user.EmployeeId)
.MustNotBeEmpty()
.MustAsync(ExistInDatabase).WithMessage("Employee not found");
}

public async Task<bool> ExistInDatabase(Command command, string id, CancellationToken cancelation)
{
return await _context.Employees.AnyAsync(x => x.Id == id.ToGuid());
}
}

这个和其他数据库检查非常常见,我几乎在每个验证器中都编写了这样的方法。

我想把它变成一个扩展方法,我会在其中传递实体类型、上下文和 ID。

A FluentValidation扩展方法如下所示:

public static IRuleBuilderOptions<T, string> MustNotBeEmpty<T>(this IRuleBuilder<T, string> rule)
{
return rule
.NotEmpty().WithMessage("O campo '{PropertyName}' não pode ser vazio");
}

但是这些扩展方法已经接受了通用类型,我不知道如何传递另一个通用类型以与 context.Set<T>().AnyAsync(...) 一起使用

这怎么可能呢?

-----更新-----

我尝试添加另一个通用类型 T2到扩展方法,但它不起作用:

    public static IRuleBuilderOptions<T, string> MustExistInDatabase<T, T2>(this IRuleBuilder<T, string> rule, DatabaseContext context) where T2: BaseEntity
{
return rule.MustAsync(async (command, id, cancelation) => await context.Set<T2>().AnyAsync(x => x.Id == id.ToGuid())).WithMessage("'{PropertyName}' not found in database");
}

当我尝试调用它时,编译器提示找不到这样的扩展方法:

public class Validator : AbstractValidator<Command>
{
public Validator()
{
...

RuleFor(user => user.EmployeeId)
.MustNotBeEmpty()
.MustExistInDatabase<Employee>();
}
}

最佳答案

我也遇到了同样的问题,结果是这样的

    public static IRuleBuilderOptions<T, Guid> MustExistInDatabase<T, TEntity>(this IRuleBuilder<T, Guid> ruleBuilder, DbSet<TEntity> dbSet) where TEntity : class
{
return ruleBuilder.Must(id => dbSet.Find(id) != null).WithMessage("'{PropertyName}' {PropertyValue} not found.");
}

然后

RuleFor(r => r.EmployeeId).NotEmpty().MustExistInDatabase(context.Employees);

关于c# - 用于检查数据库中是否存在实体的 FluentValidator 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57572102/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com