Entity Framework - DbUpdateException для пользовательского исключения - PullRequest
3 голосов
/ 15 ноября 2011

Я использую Entity Framework и когда DbUpdateException выбрасывается из dbContext.SaveChanges (), как мне создать пользовательское исключение и выдать его вместо этого?

Могу ли я создать условие для каждого ограничения SQL, которое может быть выброшено:

if (e.InnerException.InnerException.Message.Contains("UNIQUE KEY"))
{
     throw new CustomException("message");
}

1 Ответ

2 голосов
/ 15 ноября 2011

РЕДАКТИРОВАТЬ: Этот подход имеет смысл для меня.Если вы знаете, что в вашем приложении / БД будет определенная ошибка, и это поможет вам или вашим пользователям иметь определенный тип пользовательского исключения, который быстро идентифицирует то, что в противном случае было бы несколько сложным или специфическим сценарием, тогда абсолютно да.Рекомендуется использовать как исключение тип , так и исключение сообщение , чтобы ошибка была максимально понятной.Мой код, приведенный ниже, является еще более простым примером, чем тот, в который вы, похоже, углубляетесь.Вместо того, чтобы позволить другому коду закончиться нулевым ссылочным исключением или каким-либо другим следствием, я бью все до конца с помощью throw new DatabaseDataNotFoundException("Cannot find ServerAppConfiguration value for {0}", key);.

Просто создайте свой собственный класс исключений, который наследует от Exception, вот пользовательское исключение Iиспользуйте именно для этой цели:

public class DatabaseDataNotFoundException : Exception
{
    public DatabaseDataNotFoundException() : base() { }

    public DatabaseDataNotFoundException(string message) : base(message) { }

    public DatabaseDataNotFoundException(string message, params object[] args)
        : base(String.Format(CultureInfo.CurrentCulture, message, args)) { }

    public DatabaseDataNotFoundException(string message, Exception inner)
        : base(message, inner) { }

    public DatabaseDataNotFoundException(string message, Exception inner, params object[] args)
        : base(String.Format(CultureInfo.CurrentCulture, message, args), inner) { }

    protected DatabaseDataNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) { }
}

Тогда ваш код станет:

if (e.InnerException.InnerException.Message.Contains("UNIQUE KEY"))
{
    throw new DatabaseDataNotFoundException("message");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...