2013-05-02 2 views
6

Структура сущности предоставляет мне общие сообщения в исключении, не сообщая мне точную сущность и атрибут, вызвавший ошибку. Как получить дополнительную информацию об ошибке?узнать точное сущность, вызывающую исключение в инфраструктуре сущности

Это происходит во многих случаях, таких как

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

и

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

Сведения об исключении:

[SqlException (0x80131904): Преобразование типа данных datetime2 к типу DateTime данных привело к значению вне-диапазона. Заявление было прекращено.] System.Data.SqlClient.SqlConnection.OnError (SqlException исключение, булева breakConnection) +404 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412 System.Data.SqlClient.TdsParser. Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2660 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +59 System.Data.SqlClient.SqlDataReader.get_MetaData() +118 системы. Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6431425 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior , Булева returnStream, булева асинхронной) +6432994 System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булева returnStream, метод String, DbAsyncResult результат) +538 System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior , runBehavior runBehavior, Boolean returnStream, метод String) +28 System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) +256 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior) +19 System. Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute (переводчик UpdateTranslator, соединение EntityConnection, словарь 2 identifierValues, List 1 сгенерированныйValues) +270 System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManag er stateManager, адаптер IEntityAdapter) +391

[UpdateException: Ошибка при обновлении записей. Смотрите внутреннее исключение для деталей.] System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, IEntityAdapter адаптер) +11223976 System.Data.Objects.ObjectContext.SaveChanges (опции SaveOptions) +833 системы. Data.Entity.Internal.InternalContext.SaveChanges() +218

[DbUpdateException: Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение.] System.Data.Entity.Internal.InternalContext.SaveChanges() +291

+0

Сколько мест вы используете 'Datetime2'? Прочитайте [это] (http://stackoverflow.com/a/1334193/1466627). –

ответ

7

Вот код, который я имею в своем решении:

try 
{ 
    _context.SaveChanges(); 
} 
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) 
{ 
    Exception raise = dbEx; 
    foreach (var validationErrors in dbEx.EntityValidationErrors) 
    { 
     foreach (var validationError in validationErrors.ValidationErrors) 
     { 
      string message = string.Format("{0}:{1}", validationErrors.Entry.Entity.ToString(), validationError.ErrorMessage); 
      //raise a new exception inserting the current one as the InnerException 
      raise = new InvalidOperationException(message , raise); 
     } 
    } 
    throw raise; 
} 

Вы можете использовать его в качестве основы для добавления в решение ... он строит вложенный набор исключений со всеми деталями из Entity Framework.

+0

Я думаю, что это хорошо для первой ошибки, но для второй ошибки я не получаю 'DbEntityValidationException', я получаю следующее:' [DbUpdateException: Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение.] ' – chadisbad

+0

@chadisbad, что говорит внутреннее исключение? – qujck

+0

Внутреннее исключение - «Преобразование типа данных datetime2 в тип данных даты и времени, приводящее к значению вне диапазона. Заявление было прекращено. «Я хочу знать, могу ли я узнать конкретный объект и атрибут (столбец), который вызывает исключение. – chadisbad

1

Вы должны писать тесты для хранилищ и в базовом классе для испытаний:

try 
{ 
    DbContext.SaveChanges(); 
} 
catch (DbEntityValidationException e) 
{ 
    e.EntityValidationErrors.SelectMany(error => error.ValidationErrors).ToList().ForEach(
    item => Console.WriteLine("{0} - {1}", item.PropertyName, item.ErrorMessage)); 
    throw; 
} 
+0

Выше решение не работает для базы данных MySql. Поскольку MySql-коннектор выдает исключение типа MySql.Data.MySqlClient.MySqlException. Любая идея, что можно сделать в этом случае? –

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