2015-12-02 2 views
0

Почему интерфейс ошибки EF так бесполезен? Как можно найти точную причину исключения DbContext.SaveChanges, когда ошибки почти ничего не сообщают о параметрах, участвующих в исключении?Как найти точную причину исключения DbContext.SaveChanges?

Один серьезный недостаток EF, на мой взгляд, определяет то, что вызывает данное исключение после выпуска SaveChanges().

Давно я боролся с интерфейсом ошибки EF. Я однажды немного помог себе, написав method, что flattens все ошибки проверки контекста db, содержащие простые сообщения с таблицей, столбцом и сообщением об ошибке для каждой ошибки. В противном случае вам нужно глубоко вникать в структуры ошибок, возвращаемые dbContext ... Интересно, почему они так сделали!

В любом случае, к моей проблеме: Я выполняю несколько операций над несколькими объектами в моем dbContext, а в конце выпуска один единственный SaveChanges().

Теперь я GetValidationErrors() возвращает 0 ошибок, поэтому никаких вопросов проверки не существует. Но SaveChanges бросает следующее исключение:

Превращение datetime2 типа данных в тип данных даты и времени привело к значению вне-диапазона. Заявление было прекращено.

Как DbContext указывает на конкретную причину ошибки в любом случае, когда то, что он переходит к вам вложенная лабиринт внутренних объектов, выглядит следующим образом:

enter image description here

?!

+0

EF использует поля Datetime2 при обращении/магазины моделей. Вы позволяете EF создавать модель или сопоставлять ее с существующей базой данных? – MutantNinjaCodeMonkey

+0

Просто нашел вопрос SO, который решает эту проблему: http://stackoverflow.com/questions/3586566/datetime2-error-when-using-entity-framework-in-vs-2010-net-4-0 – MutantNinjaCodeMonkey

+0

@MutantNinjaCodeMonkey: работая в EF Database First mode (отображает существующую базу данных) – Veverke

ответ

0

Если это DbEntityValidationException вы можете просто переопределить метод SaveChanges и захватить ошибку и повторно бросить его с ошибками разбираемых что-то вроде этого:

public partial class MyEntities 
{ 
    public override int SaveChanges() 
    { 
     try 
     { 
      return base.SaveChanges(); 
     } 
     catch (DbEntityValidationException ex) 
     { 
      var errorMessages = ex.EntityValidationErrors 
            .SelectMany(x => x.ValidationErrors) 
            .Select(x => x.ErrorMessage); 
      var fullErrorMessage = string.Join("\n\r", errorMessages); 

      var exceptionMessage = string.Concat(ex.Message, "The validation errors are: ", fullErrorMessage); 

      throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); 
     } 
    } 
} 
+0

Я не уверен, как это отличается от того, что было упомянуто выше, [здесь] (http://devrecipeshb.blogspot.co.il/2015/08/extension-method -to-flatten-entity.html) – Veverke

+0

Извините, я не видел эту ссылку. Но я думаю, это даст вам тот же результат. Так что если это решение сработало для вас ... в чем проблема? – ewahner

+0

спасибо за помощь, но это не проблема :-) Я спрашиваю: почему это сложно получить полезные/значимые сообщения об ошибках из исключений DbContext.SaveChanges? То, как вы это делаете (например, я сделал, чтобы собрать все ошибки в одной структуре (мой предоставляет немного больше - добавляет имя поля и таблицы, участвующих в ошибке) - ** не отвечает ** на все проблемы - потому что можно получить исключение DbContext.SaveChanges без каких-либо ошибок в EntityValidations (что имеет смысл, поскольку они только обеспечивают ошибки проверки. Исключение - ошибка времени выполнения, что-то другое) – Veverke

Смежные вопросы