我的一个表有一个唯一的键,当我试图插入一个重复的记录时,它会像预期的那样抛出一个异常。但是我需要将唯一的键异常与其他异常区分开来,这样我就可以针对唯一的键约束违反情况定制错误消息。
我在网上找到的所有解决方案都建议将 ex.InnerException
转换为 System.Data.SqlClient.SqlException
,并检查 Number
属性是否等于2601或2627,如下所示:
try
{
_context.SaveChanges();
}
catch (Exception ex)
{
var sqlException = ex.InnerException as System.Data.SqlClient.SqlException;
if (sqlException.Number == 2601 || sqlException.Number == 2627)
{
ErrorMessage = "Cannot insert duplicate values.";
}
else
{
ErrorMessage = "Error while saving data.";
}
}
但问题是,将 ex.InnerException
强制转换为 System.Data.SqlClient.SqlException
会导致无效的强制转换错误,因为 ex.InnerException
实际上是 System.Data.Entity.Core.UpdateException
的类型,而不是 System.Data.SqlClient.SqlException
。
上面的代码有什么问题? 我如何捕捉唯一键约束违规?