В одной из моих таблиц есть уникальный ключ, и когда я пытаюсь вставить дублируемую запись, она генерирует исключение, как ожидалось. Но мне нужно отличать уникальные исключения ключей от других, так что я могу настроить сообщение об ошибке для уникальных нарушений ограничения ключа.Как я могу исключить исключения исключения UniqueKey с EF6 и SQL Server?
Все решения, которые я нашел в Интернете предлагает бросить 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 как SqlException» вместо «ex.InnerException as SqlException». –
Есть ли способ обнаружить также, на каком нарушении произошло нарушение столбца? В одной таблице может быть несколько уникальных ключей ... – Learner
@Learner Единственный способ, которым я могу думать, - разобрать сообщение об ошибке (в котором указано имя ограничения/столбца), но это было бы не очень хорошо (сообщения об ошибках могут быть обновлены в будущем и, что более важно, переведены на несколько языков) – ken2k