我有这段代码在保存期间记录更改:
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()
});
}
}
得到的
但是,我在第一行收到错误:
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中没有原始值。所以我不知何故需要比较原始值来检查哪些值已经改变。
答案 0 :(得分:1)
例外来自GetValue<object>(property)
来电。
GetValue
方法的泛型类型参数应该是确切的属性类型,即不能用于将通用值作为object
。
相反,您可以使用其中一个PropertyValues
对象索引器来实现此目的,例如entityEntry.OriginalValues[property]
和entityEntry.CurrentValues[property]
。
关于更新。附加实体实例时,OriginalValues
和CurrentValues
将是同一个。在这种情况下,您可以使用OriginalValues
方法调用的结果代替GetDatabaseValues
属性,例如
var originalValues = entityEntry.GetDatabaseValues();