我的表中有一个表具有唯一键,当我尝试插入重复记录时,它会按预期抛出异常。但是我需要区分唯一的关键异常和其他异常,以便我可以自定义错误消息来解决唯一的关键约束违规问题。如何使用EF6和SQL Server捕获UniqueKey违例异常?
我在网上找到所有的解决方案,建议投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
。
上面的代码有什么问题?我如何捕获唯一键约束违规?
查看您分享的代码后,我现在可以看到我的代码问题非常明显。我应该写“ex.InnerException.InnerException as SqlException”而不是“ex.InnerException as SqlException”。 –
有没有办法来检测哪个列违规发生?在一个表中可能有多个唯一键... – Learner
@Learner我能想到的唯一方法是解析错误消息(其中声明约束/列的名称),但它不会是一个很好的解决方案(错误消息将来可能会更新,更重要的是,会翻译成多种语言) – ken2k