检查Entity Framework Core中的字段更改时如何解决错误

时间:2018-04-12 01:43:20

标签: c# entity-framework entity-framework-core

我有这段代码在保存期间记录更改:

foreach (var property in entityEntry.OriginalValues.Properties)
{       
    if (!object.Equals(entityEntry.OriginalValues.GetValue<object>(property),
                entityEntry.CurrentValues.GetValue<object>(property)))
            {
                this.Events.Add(
                    new Event()
                    {
                        AppUserId = this._appUserProvider.CurrentAppUserId,
                        EventDate = DateTimeOffset.UtcNow,
                        EventTypeId = eventTypeId,
                        RecordId = entityEntry.OriginalValues.GetValue<int>("Id"),
                        ColumnName = property.Name,
                        OriginalValue =
                            entityEntry.OriginalValues.GetValue<object>(property) == null
                            ? null
                            : entityEntry.OriginalValues.GetValue<object>(property).ToString(),
                        NewValue =
                            entityEntry.CurrentValues.GetValue<object>(property) == null
                            ? null
                            : entityEntry.CurrentValues.GetValue<object>(property).ToString()
                    });
            }
}

我是从this question

得到的

但是,我在第一行收到错误:

Unable to cast object of type 'System.Func`2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Int32]' to type 'System.Func`2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Object]'.

它会在抛出错误时检查第一个字段,它是一个int Id字段。

我该如何解决?我不太明白这个问题是什么。

也许它在Entity Framework中有效,但现在不在EntityFrameworkCore中?

更新:突然间,我意识到问题所在。这是一个从API调用添加的实体,并且状态设置为modified,因此StateTracker中没有原始值。所以我不知何故需要比较原始值来检查哪些值已经改变。

1 个答案:

答案 0 :(得分:1)

例外来自GetValue<object>(property)来电。

GetValue方法的泛型类型参数应该是确切的属性类型,即不能用于将通用值作为object

相反,您可以使用其中一个PropertyValues对象索引器来实现此目的,例如entityEntry.OriginalValues[property]entityEntry.CurrentValues[property]

关于更新。附加实体实例时,OriginalValuesCurrentValues将是同一个。在这种情况下,您可以使用OriginalValues方法调用的结果代替GetDatabaseValues属性,例如

var originalValues = entityEntry.GetDatabaseValues();