当无法找到请求的 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);
}
问题是:
我不是 100% 确定我应该捕获 NpgsqlException
我想确定如果抛出异常,那是因为 table 不存在。我查找 the PostgreSQL documentation of error codes and error code 42P01 is undefined table. I believe I want to use that, but how? I looked up the members of the NpgsqlException class,然后找到了 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);
}
}
但我不确定这是否有意义(我什至不确定 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;
}
}
}
我正在使用 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);
}
问题是:
我不是 100% 确定我应该捕获 NpgsqlException
我想确定如果抛出异常,那是因为 table 不存在。我查找 the PostgreSQL documentation of error codes and error code 42P01 is undefined table. I believe I want to use that, but how? I looked up the members of the NpgsqlException class,然后找到了 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); } }
但我不确定这是否有意义(我什至不确定 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;
}
}
}