Подтвердить что ты не робот

Дублировать ключевое исключение из Entity Framework?

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

4b9b3361

Ответ 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);
    }