【问题标题】:DbContext.SaveChangesAsync Exception HandlingDbContext.SaveChangesAsync 异常处理
【发布时间】:2015-07-12 07:31:32
【问题描述】:

在 Visual Studio 2013 中使用异步操作和实体框架支持构建新的 ApiController 时,某些方法将 DbContext.SaveChangesAsync 调用包装在 try-catch 块中。

比如Put方法,

try
{
    await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
    if (!EmployeeExists(id))
    {
        return NotFound();
    }
    throw;
}

来自 msdn.microsoft.com 关于DbUpdateConcurrencyException

当预期实体的 SaveChanges 会导致数据库更新但实际上数据库中没有任何行受到影响时,DbContext 抛出异常。

DbUpdateConcurrencyException 派生自 DbUpdateExceptionDbContext.SaveChangesAsync 方法还可以抛出一些其他异常。

我想知道为什么这些other exceptions 没有catch 子句?是为了简洁吗?或者他们根本不属于应用程序的这个级别?

【问题讨论】:

  • 我知道这是旧的,但这是我的一个问题。似乎该方法是使用将自动处理异常的框架异常处理。这意味着您希望异常是......异常的,它们会被自动记录下来,并且响应作为一些默认的 ObjectResult 发送。

标签: c# asp.net entity-framework exception asp.net-web-api


【解决方案1】:

Web API 脚手架控制器遵循 REST 语义,因此 PUT 实际上是对记录的更新。

MSDN 消息指出,如果记录未更新,则会引发异常,因此在这种情况下,如果记录更新失败,它将引发异常。 如果记录不存在,则返回 404 not found。

总之,虽然数据库抛出了异常,但在 REST 服务的上下文中它可能是一个有效的情况(因为记录不存在而没有执行更新),而不是真正的错误。其他异常将被告知客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多