12

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

这在很多情况下都会发生,例如

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

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。该语句已终止。

异常详情:

[SqlException (0x80131904):将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。语句已终止。] 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,字符串 resetOptionsString)+6431425 System.Data.SqlClient.SqlCommand。2 identifierValues, List1 生成值)+270 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter 适配器)+391

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

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

4

2 回答 2

10

这是我的解决方案中的代码:

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;
}

您可以将它用作添加到您的解决方案的基础......它构建了一组嵌套的异常,其中包含来自实体框架的所有详细信息。

于 2013-05-02T21:21:51.923 回答
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;
}
于 2013-05-03T13:35:17.487 回答