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)
顺便说一句,我建议您不要在正常代码中执行架构更新。仅在安装程序中或在启动时作为升级执行此类操作。
| 归档时间: |
|
| 查看次数: |
14001 次 |
| 最近记录: |