更新记录时,EntityHistoryHelper.ShouldSavePropertyHistory抛出null异常

时间:2018-04-10 07:03:36

标签: c# nullreferenceexception aspnetboilerplate

使用MVC jQuery,.NET Core,ABP v3.5.0。

已启用实体历史记录:Configuration.EntityHistory.IsEnabled = true;

我使用t-sql将一些数据直接插入到表中。 如果我尝试通过Web应用程序更新其中一条记录,我会看到抛出的异常:

  

System.NullReferenceException:未将对象引用设置为对象的实例。

System.NullReferenceException: Object reference not set to an instance of an object.
   at Abp.EntityHistory.EntityHistoryHelper.ShouldSavePropertyHistory(PropertyEntry propertyEntry, Boolean defaultValue) in D:\Github\aspnetboilerplate\src\Abp.ZeroCore.EntityFrameworkCore\EntityHistory\EntityHistoryHelper.cs:line 292
   at Abp.EntityHistory.EntityHistoryHelper.GetPropertyChanges(EntityEntry entityEntry) in D:\Github\aspnetboilerplate\src\Abp.ZeroCore.EntityFrameworkCore\EntityHistory\EntityHistoryHelper.cs:line 210
   at Abp.EntityHistory.EntityHistoryHelper.CreateEntityChangeInfo(EntityEntry entityEntry) in D:\Github\aspnetboilerplate\src\Abp.ZeroCore.EntityFrameworkCore\EntityHistory\EntityHistoryHelper.cs:line 160
   at Abp.EntityHistory.EntityHistoryHelper.CreateEntityChangeSet(ICollection`1 entityEntries) in D:\Github\aspnetboilerplate\src\Abp.ZeroCore.EntityFrameworkCore\EntityHistory\EntityHistoryHelper.cs:line 95
   at Abp.Zero.EntityFrameworkCore.AbpZeroCommonDbContext`3.<SaveChangesAsync>d__98.MoveNext()
--- End of stack trace from previous location where exception was thrown ---

我禁用了实体历史记录并删除了实体历史记录选择器,现在再次对使用t-sql直接插入表中的记录进行更新。

Configuration.EntityHistory.IsEnabled = false;

//Configuration.EntityHistory.Selectors.Add(
//    new NamedTypeSelector(
//        "Abp.AuditedEntity",
//        type => typeof(IAudited).IsAssignableFrom(type)
//    )
//);

实体历史记录功能是否依赖于必须通过网络应用程序插入的数据?

1 个答案:

答案 0 :(得分:1)

  

实体历史记录功能是否依赖于必须通过网络应用程序插入的数据?

没有

这已在ABP v3.6.0中修复:#3314

  

正如documentation所说,PropertyInfo对于阴影属性或直接映射到字段的属性可以为null。

基本上,这需要{strong> EntityHistoryHelper.cs 进行null检查:

// if (propertyInfo.IsDefined(typeof(DisableAuditingAttribute), true))
   if (propertyInfo != null &&
       propertyInfo.IsDefined(typeof(DisableAuditingAttribute), true))