找出导致实体框架中的异常的确切实体

时间:2013-05-02 20:35:29

标签: entity-framework

实体框架在异常中给出了通用消息,而没有告诉我确切的实体和导致错误的属性。如何获取有关错误的更多信息?

在许多情况下会发生这种情况,例如

  

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

  

将datetime2数据类型转换为日期时间数据类型会导致超出范围的值。声明已经终止。

异常详情:

  

[SqlException(0x80131904):将datetime2数据类型转换为日期时间数据类型导致超出范围的值。   该语句已终止。]      System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean 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      System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)+6431425      System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)+6432994      System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result)+538      System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)+28      System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method)+256      System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)+19      System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator,EntityConnection connection,Dictionary 2 identifierValues, List 1 generatedValues)+270      System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)+391

     

[UpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常。]      System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)+11223976      System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)+833      System.Data.Entity.Internal.InternalContext.SaveChanges()+ 218

     

[DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常。]      System.Data.Entity.Internal.InternalContext.SaveChanges()+ 291

2 个答案:

答案 0 :(得分:9)

以下是我的解决方案中的代码:

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中的所有详细信息构建一组嵌套的异常。

答案 1 :(得分: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;
}