查找实体框架中引起异常的确切实体。

24 浏览
0 Comments

查找实体框架中引起异常的确切实体。

实体框架在异常中提供了泛型信息,但未告知导致错误的具体实体和属性。如何获取更多关于错误的信息?

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

操作失败:由于一个或多个外键属性是非空的,所以关系不能更改。当关系被更改时,相关的外键属性被设置为 null 值。如果外键不支持空值,则必须定义新关系、分配其他非空值的外键属性,或删除无关的对象。

以及

将 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, 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, Dictionary2 identifierValues, List1 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

admin 更改状态以发布 2023年5月22日
0
0 Comments

你需要为仓库编写测试代码,并在测试基类中进行编写:

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
0 Comments

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

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