Я пытаюсь поймать исключение, возникшее при вставке уже существующего пользователя с данным именем пользователя в мою базу данных. Как говорится в заголовке, я использую EF. Единственное исключение, которое бросается, когда я пытаюсь вставить пользователя в db, - это "Исключение UpdateException". Как я могу извлечь это исключение, чтобы определить, является ли это дублирующее исключение или что-то еще?
Дублировать ключевое исключение из Entity Framework?
Ответ 1
catch (UpdateException ex)
{
SqlException innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Number == ??????)
{
// handle exception here..
}
else
{
throw;
}
}
Поместите правильное число в ??????
, которое соответствует уникальному нарушению ограничения (я не знаю его с головы).
Ответ 2
Теперь в С# 6.0 вы сможете сделать что-то вроде этого:
catch (UpdateException ex) when ((ex.InnerException as SqlException)?.Number == ??????)
{
// Handle exception here
}
Ответ 3
Поскольку я использую EntityFramework с С#, мне пришлось внести незначительные изменения в это - надеюсь, что это поможет кому-то...
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateException ex)
{
SqlException innerException = ex.InnerException.InnerException as SqlException;
if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601))
{
//your handling stuff
}
else
{
throw;
}
}
Моя проблема возникла из-за того, что мне требовалось исключение DbUpdateException вместо UpdateException, а мой объект InnerException имел дополнительный объект InnerException, содержащий нужный мне номер...
Ответ 4
Я думаю, что это лучше, если вы предотвратите это исключение. Если это возможно с вашим кодом, я бы сделал следующее:
При использовании структуры сущностей лучше всего сначала попробовать и получить запись, которая вызовет у вас проблемы, с LINQ SingleOrDefault. Теперь вы можете обновить получаемый объект экземпляром, который вы хотите вставить, и защищает ваш идентификационный номер с автоматическим приращением, если вы его используете. Если SingleOrDefault имеет значение null, вы можете безопасно добавить свою сущность.
пример кода:
public override void AddOrUpdate(CustomCaseSearchCriteria entity)
{
var duplicateEntityCheck = GetSingleByUniqueConstraint(entity.UserCode, entity.FilterName);
if (duplicateEntityCheck != null)
{
duplicateEntityCheck.Overwrite(entity);
base.Update(duplicateEntityCheck);
}
else
base.Add(entity);
}
public virtual CustomCaseSearchCriteria GetSingleByUniqueConstraint(string userCode, string filterName)
{
return GetAllInternal().SingleOrDefault(sc => sc.UserCode == userCode && sc.FilterName == filterName);
}