我的表中有一個表具有唯一鍵,當我嘗試插入重複記錄時,它會按預期拋出異常。但是我需要區分唯一的關鍵異常和其他異常,以便我可以自定義錯誤消息來解決唯一的關鍵約束違規問題。如何使用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