Дубликат ключевого исключения из Entity Framework? - PullRequest
28 голосов
/ 19 октября 2010

Я пытаюсь поймать исключение, которое выдается, когда я вставляю уже существующего пользователя с данным именем пользователя в мою базу данных.Как следует из названия, я использую EF.Единственное исключение, которое выдается, когда я пытаюсь вставить пользователя в базу данных, - это «UpdateException». Как извлечь это исключение, чтобы определить, является ли оно дублирующим исключением или чем-то еще?

Ответы [ 5 ]

38 голосов
/ 19 октября 2010
catch (UpdateException ex)
{
    SqlException innerException = ex.InnerException as SqlException;
    if (innerException != null && innerException.Number == ??????)
    {
        // handle exception here..
    }
    else
    {
        throw;
    }
}

Поставьте правильное число на ??????, которое соответствует уникальному нарушению ограничения (я не знаю его по макушке).

14 голосов
/ 27 апреля 2016

Поскольку я использую EntityFramework с C #, мне пришлось внести в это небольшое изменение - надеюсь, это кому-нибудь поможет ...

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;
    }
}

Моя проблема возникла из-за того, что вместо UpdateException мне потребовалось DbUpdateException, а у моего объекта InnerException был дополнительный объект InnerException, содержащий необходимое мне число ...

13 голосов
/ 15 января 2016

Теперь в C # 6.0 вы сможете сделать что-то вроде этого:

catch (UpdateException ex) when ((ex.InnerException as SqlException)?.Number == ??????)
{
    // Handle exception here
}
2 голосов
/ 07 ноября 2018

Теперь в C # 7 вы можете использовать оператор is

// 2627 is unique constraint (includes primary key), 2601 is unique index
catch (UpdateException ex) when (ex.InnerException is SqlException sqlException && (sqlException.Number == 2627 || sqlException.Number == 2601))
{

}
1 голос
/ 15 декабря 2017

Я думаю, будет лучше, если вы предотвратите исключение.Если это возможно с вашим кодом, я бы сделал следующее:

При использовании Entity Framework лучше всего сначала попытаться получить запись, которая вызовет у вас проблемы, с SingleQrDefault LINQ.Теперь вы можете обновить полученный объект с помощью экземпляра, который вы хотите вставить, и сохранит ваш ID-номер с автоматическим приращением, если вы его используете.Если 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...