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

Dre*_*rew 5 c# postgresql error-handling entity-framework npgsql

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

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

问题是:

  • 我不是 100% 确定我应该捕获 NpgsqlException

  • 我想确保如果抛出异常,那是因为该表不存在。我查阅了错误代码的 PostgreSQL 文档,错误代码 42P01 是未定义的表。我相信我想用它,但是怎么用呢?我查找了NpgsqlException 类的成员,找到了 ErrorCode。然而,这是一个 int 类型。如果我可以将上面的代码更改为如下所示,那就太好了

    try
    {
        return _context.Set(entityType).Add(entity);
    }
    catch (NpgsqlException ex)
    {
        if (ex.ErrorCode.Equals(42P01))
        {
            CreateEntityTable(entity); //a private method I made
            return _context.Set(entityType).Add(entity);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

但我不确定这是否有意义(我什至不确定 42P01 如何成为一个 int)。

任何帮助,将不胜感激。

小智 5

您将需要使用 NpgsqlException 的 Code 属性,因为它将包含 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 只是一个更新。代码已弃用。请改用 SQLState。 (5认同)
  • 另外,我应该向其他可能发现这很有用并且也在使用实体框架的人指出,您无法直接捕获“NpgsqlException”。您首先必须捕获“EntityCommandExecutionException”,然后使用“ex.InnerException”来获取“NpgsqlException”。我刚刚测试了这个。 (3认同)