【问题标题】:How to resolve the Cannot await in the filter expression?如何解决过滤器表达式中的Cannot await?
【发布时间】:2024-01-25 16:27:01
【问题描述】:

我正在关注这里的代码示例:https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-6.0&tabs=visual-studio-code

try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException) when (!TodoItemExists(id))
            {
                return NotFound();
            }

在我的代码中,方法 TodoItemExists(在我的例子中方法名称是 UserExists)是异步的。

代码示例:

try
{
    await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException) when (!await UserExists(id))
{
    return NotFound();
}

错误:无法在过滤器表达式中等待

正确的写法是什么?

【问题讨论】:

  • 您必须像在旧版本中通常那样在 catch 块中应用条件。
  • 为什么这个真正的问题会有反对票
  • 不是投票者,但您可能有一个更大的问题 - 错误处理程序 用于具有 immediate 的 database failure 决策处理对数据库的依赖性有问题的。如果数据库宕机了怎么办?
  • @MickyD - 我在这里探索微软给出的教程:docs.microsoft.com/en-us/aspnet/core/tutorials/…

标签: c# .net async-await .net-6.0


【解决方案1】:

“旧”方式:

try
{
    await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException) 
{
    if (!await UserExists(id)) 
      return NotFound();
    else   
      throw;
}

但您可能希望在“找到用户但其他人先修改它”的情况下返回其他内容,以便客户端可以决定要做什么 - 甚至可以发送当前状态。在我看来,客户端/用户是合理的唯一可以解决“跳过/覆盖/合并”选择的东西

【讨论】:

    最近更新 更多