当无法找到请求的 PostgreSQL table 时,如何捕获异常并使用错误代码?

How to catch an exception and use error codes when the requested PostgreSQL table can't be found?

我正在使用 Entity Framework,所以我相信我应该使用 NpgsqlException,因为它是 PostgreSQL 的 .NET 数据提供程序。因此,假设我对上下文进行了查询。如果 table 在 PostgreSQL 数据库中不存在,我想捕获抛出的异常,然后手动创建它。下面的代码是如何插入实体的示例,如果需要,我尝试使用错误处理来创建 table:

try
{
    return _context.Set(entityType).Add(entity);
}
catch (NpgsqlException)
{
    CreateEntityTable(entity); //a private method I made
    return _context.Set(entityType).Add(entity);
}

问题是:

但我不确定这是否有意义(我什至不确定 42P01 怎么可能是一个 int)。

如有任何帮助,我们将不胜感激。

您需要使用 NpgsqlException 的代码 属性,因为它将包含 PostgreSql 错误代码。

正在更新您的示例:

try
{
    return _context.Set(entityType).Add(entity);
}
catch (NpgsqlException ex)
{
    if (ex.Code == "42P01")
    {
        CreateEntityTable(entity); //a private method I made
        return _context.Set(entityType).Add(entity);
    }
}

顺便说一句,我建议您不要在普通代码中执行模式更新。仅在安装程序中或作为升级启动时执行此类操作。

测试并使用 ASP NET Core 3.1 和 ASP NET Core 5.0

try
{
    _context.Add(entity);
    await _context.SaveChangesAsync().ConfigureAwait(false);
    return RedirectToAction(nameof(Index));
}
catch (DbUpdateException ex)
{
    if (ex.GetBaseException() is PostgresException pgException)
    {
        switch (pgException.SqlState)
        {
            case "23505":
                ModelState.AddModelError(string.Empty, "This entity exists in the database");
                return View(yourViewModelFromRequest);
            default:
                throw;
         }
     }
}