Как мне перехватить SqlException, выдаваемое RAISERROR, вызываемым в триггере, установленном Entity Framework 4? - PullRequest
7 голосов
/ 25 февраля 2012

У меня установлен Entity Framework для обновления таблицы. Обновление перехватывается триггером вместо триггера, который вызывает RAISERROR:

CREATE TRIGGER mySchema.UpdateBusinessObjects
ON mySchema.BusinessObjects
INSTEAD OF UPDATE
AS
    RAISERROR(''test error from SQL'',16,1)
    RETURN

В моем классе репозитория я пытаюсь перехватить SqlException, сгенерированный RAISERROR в SQL:

public void SaveBusinessObject(BusinessObject b) {
    try {
         repo.Entry(b).State = EntityState.Modified;
         repo.SaveChanges();
    } catch (SqlException ex) {
         // handle exception here
    }
}

Проблема в том, что C # не перехватывает SqlException; оно передается вызывающей стороне как необработанное исключение («SqlException не было обработано пользователем: ошибка теста из SQL»). Какие?!

Похоже, что EF SaveChanges () как-то передает исключение по моему блоку try catch. Я попытался переключить свой оператор catch на catch (Exception ex) на случай, если исключение EF как-то более общее, но я все еще получаю необработанное исключение SqlException. Я что-то упускаю здесь? В чем проблема с методом SaveChanges ()?

Ответы [ 4 ]

1 голос
/ 25 февраля 2012

Я попробовал почти тот же триггер, который вы используете для таблицы, и попытался сохранить соответствующий (новый) объект через структуру сущностей. Из того, что я вижу, выбрасываемое исключение имеет тип System.Data.UpdateException, а не SqlException. Внутреннее исключение - SqlException, и оно содержит пользовательское сообщение, которое вы вызвали в триггере, «тестовая ошибка из SQL». Надеюсь, это поможет

0 голосов
/ 06 сентября 2017

Есть 2 вещи: -

  1. Если вы хотите, чтобы RAISERROR выдавал SqlException, вам нужно установить его серьезность выше 10. Ошибки со степенью серьезности 10 и ниже являются информационными и поэтому не выдают исключений.

  2. Catch EntityException или установить точку останова в блоке перехвата общего исключения. В окне немедленного просмотра проверьте тип исключения: ex.GetType ();

0 голосов
/ 14 ноября 2012

У меня была именно эта проблема.

Я использовал мини-профилировщик MVC для профилирования времени запроса.Я обнаружил, что если я удалил его из своего проекта, то исключения были получены, как я и ожидал.

0 голосов
/ 25 февраля 2012

Единственный способ, которым я знаю, чтобы исключение избегало одной попытки, - это исключение в другом потоке. Может ли код EF выполняться в другом потоке? Возможно, вы можете включить исключение с вероятностью 1º в диалоговом окне «Исключения».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...