Fluentvalidation FindAsync永远不会回来,但是FindAsync工作正常

Fluentvalidation FindAsync永远不会回来,但是FindAsync工作正常,fluentvalidation,ef-core-2.2,fluentvalidation-2.0,Fluentvalidation,Ef Core 2.2,Fluentvalidation 2.0,我正在使用FluentValidation来验证对象。我只是检查数据库中是否存在该用户。在我的例子中,DbContext.Entity.Find工作正常,但DbContext.Entity.FindAsync永远不会返回 请参考下面的源代码 public class ChangeStatusOfUserCommandValidator : AbstractValidator<ChangeStatusOfUserCommand> { private readonly F

我正在使用FluentValidation来验证对象。我只是检查数据库中是否存在该用户。在我的例子中,DbContext.Entity.Find工作正常,但DbContext.Entity.FindAsync永远不会返回

请参考下面的源代码

    public class ChangeStatusOfUserCommandValidator : AbstractValidator<ChangeStatusOfUserCommand>
{
    private readonly FieldSellDbContext dbContext;
    private ChangeStatusOfUserCommandValidator()
    { }

    public ChangeStatusOfUserCommandValidator(FieldSellDbContext databaseContext)
    {
        dbContext = databaseContext;
        RuleFor(u => u.UserId).NotEmpty();
        RuleFor(u => u.UserId).MustAsync(UserExists).WithMessage("Provided user id already exists in the database.");
    }

    public async Task<bool> UserExists(int value, CancellationToken cancellationToken)
    {
        var user = await dbContext.Users.FindAsync(value, cancellationToken);
        //var user = dbContext.Users.Find(value); --Works fine even in async method
        return user != null;
    }
}
public类ChangeStatusOfUserCommandValidator:AbstractValidator
{
私有只读字段SellDbContext dbContext;
私有ChangeStatusOfUserCommandValidator()
{ }
公用ChangeStatusOfUserCommandValidator(FieldSellDbContext databaseContext)
{
dbContext=数据库上下文;
RuleFor(u=>u.UserId).NotEmpty();
RuleFor(u=>u.UserId).MustAsync(UserExists).WithMessage(“提供的用户id已存在于数据库中”);
}
公共异步任务UserExists(int值,CancellationToken CancellationToken)
{
var user=await dbContext.Users.FindAsync(值,cancellationToken);
//var user=dbContext.Users.Find(value);--即使在异步方法中也可以正常工作
返回用户!=null;
}
}

谢谢

您的问题几乎肯定是在您的调用堆栈上,代码正在调用
Task.Result
Task.Wait()
Task.GetAwaiter().GetResult()
,或者类似的阻塞方法


正确的解决方法是使用;也就是说,使用
wait
而不是阻塞异步代码。Fluent validation具有异步工作流(例如,
ValidateAsync
MustAsync
),因此您需要确保使用该工作流,而不是同步API。

您使用的是哪种DBMS?是否可以使用sqlite等来尝试您的代码?我正在使用SqlExpress。我刚刚尝试了FirstOrDefaultAsync方法,它也可以正常工作,而FindAsync无法正常工作。您能否演示如何调用
UserExists
?我希望您不要忘记等待它的结果?我在下面的语句中调用UserExists方法:RuleFor(u=>u.UserId)。MustAsync(UserExists)嗨,Stephen,我的想法是相同的,以确保没有任何调用是同步的,所有调用都使用了异步。它是WebAPI中的一种方法,因此没有UI的角色。此外,我正在为这个api使用MedatR库和CQRS模式。对该验证器的调用由MediatR自动完成,MediatR用于所有其他异步调用。有关详细信息,FirstOrDefaultAsync也可以正常工作。@Kashif这很奇怪,因为
FindAsync
由同步
FindTracked
调用(与
Find
相同)组成,最后(如果在本地缓存中找不到)后跟
FirstOrDefaultAsync