Итак, у меня возникла проблема с перехватом исключения для добавления новой записи в базу данных.
Я использую Entity Framework
Вот мой код:
public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
{
using (context = new LabelPrintingContext())
{
try
{
context.EngineeredModels.Add(model);
context.SaveChanges();
}
catch (SqlException ex)
{
if (ex.Number == 2601)
{
//Violation of primary key. Handle Exception
}
else throw;
}
}
}
Я также пробовал следующее:
public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
{
using (context = new LabelPrintingContext())
{
try
{
context.EngineeredModels.Add(model);
context.SaveChanges();
}
catch (UpdateException ex)
{
var sqlException = ex.InnerException as SqlException;
if (sqlException != null && sqlException.Errors.OfType<SqlError>()
.Any(se => se.Number == 2601))
{
// it's a dupe... do something about it
}
else
{
// it's something else...
throw;
}
}
}
}
Если я просто поймаю (Exception Ex), он перехватит исключение, но я хочу проверить число, чтобы лучше ответить моему пользователю. Таким образом, если будет добавлен дубликат, я могу сообщить им об этом и исправить его соответствующим образом.
Вот изображение ошибки:
Не совсем уверен, что еще попытаться поймать конкретное исключение. Любые предложения помогут.
Первичный ключ - это строка. Номер модели - это первичный ключ. Я просто хочу знать, как обрабатывать исключение.
Ну, я не хочу дублировать номера моделей в базе данных, поэтому установка номера моей модели в качестве первичного ключа будет иметь наибольший смысл.
Мне просто интересно, почему исключение не перехватывается этими операторами catch (), а не о том, какой у меня первичный ключ и т. д., Я знаю, что первичный ключ является дубликатом, проблема заключается в том, как работает программа, она попытается добавить модель, если возникает исключение Duplicate key, вместо того, чтобы пытаться добавить его, я хочу спросить пользователя, хотят ли они вместо этого обновить запись.
Возможный дубликат Выявление исключений с помощью команды «поймать, когда»





При использовании ORM SqlException часто будет обернутым, иногда довольно сильно вложенным. Итак, вам нужна вспомогательная функция, чтобы пройти по дереву исключений и найти SqlException (если оно есть):
static SqlException GetSqlException(Exception exception)
{
if (exception is SqlException sqlException) return sqlException;
return exception.InnerException == null ? null : GetSqlException(exception.InnerException);
}
Затем вы можете использовать любую стратегию, которая вам нравится, для перехвата, сколь угодно детализированного, исключения и обработки исключения SqlException, если оно обнаружено. например на основе вашего кода:
public void AddNewStandardEngineeredModel(StandardEngineeredModel model)
{
using (context = new LabelPrintingContext())
{
try
{
context.EngineeredModels.Add(model);
context.SaveChanges();
}
catch (Exception ex)
{
var sqlException = GetSqlException(ex);
if (sqlException != null && sqlException.Errors.OfType<SqlError>()
.Any(se => se.Number == 2601))
{
// it's a dupe... do something about it
}
else
{
// it's something else...
throw;
}
}
}
}
Это прекрасно, спасибо. Отлично получилось. Это как-то раздражает, что исключение так завёрнуто. Прошел через это примерно 4 раза, прежде чем нашел исключение, которое я хотел.
по крайней мере, скажите, какой у вашего
modelпервичный ключ, это Identity? похоже, что в вашей логике есть ошибка. прошивка (заливка)ID.