我在 ASP.NET Core应用程序中用于实体框架核心的两个提供程序。SqlServer
用于生产模式,Sqlite
用于集成测试模式。
在我的应用程序DbContext
中,当SaveChangesAsync
过程中发生异常时,我会捕获它以了解发生了什么样的问题。例如,我这样做是为了能够检测唯一索引约束冲突。
我有以下问题:似乎为Sqlite
和SqlServer
提供程序(SqlException
和SqliteException
(创建了不同的异常类型。这些异常具有不同的ErrorCode
因此,如果要检测一种错误,则必须始终指定两个错误代码。
是否有人找到任何解决方案来轻松管理常见的关系数据库错误并为许多提供商提供相同的异常处理程序?
更重要的是,您是否有任何解决方案可以知道引发异常的实体的类型是什么,或者我们是否必须从异常中包含的字符串Message
中获取它?
提前感谢您的回答
有关 SQL Server 错误代码,可以参考此处: 数据库引擎错误
对于 Sqlite 错误代码,您可以参考此处:结果和错误代码
为了获取实体,您将不会从SqlException
中知道这一点。但是您可以捕获更具体的异常。例如,DbUpdateConcurrencyException
有一个您可以使用的Entries
属性。
参考:解决并发冲突
下面是处理可能适合您的身份验证错误的示例:
try
{
⋮
}
catch (SqlException e)
{
foreach (SqlError sqlError in e.Errors)
{
switch (sqlError.Number)
{
case 10028:
{
HandleAuthError(e);
break;
}
⋮
}
}
}
catch (SqliteException e)
{
switch (e.SqliteErrorCode)
{
case 23:
{
HandleAuthError(e);
break;
}
⋮
}
}
private void HandleAuthError(SystemException e)
{
⋮
}
注意:在 3.0.1 中,当引发唯一索引约束冲突时,一个错误使条目集合为空...应该在 3.1 中修复