【问题标题】:How to resolve error when checking for field changes in Entity Framework Core检查 Entity Framework Core 中的字段更改时如何解决错误
【发布时间】:2018-04-12 14:18:32
【问题描述】:

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

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 调用添加的实体,并且状态设置为已修改,因此 StateTracker 中没有原始值。所以不知何故,我需要获取原始值进行比较以检查哪些值已更改。

【问题讨论】:

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


    【解决方案1】:

    异常来自GetValue&lt;object&gt;(property) 调用。

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

    相反,您可以为此目的使用 PropertyValues 对象索引器之一,例如entityEntry.OriginalValues[property]entityEntry.CurrentValues[property]

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

    var originalValues = entityEntry.GetDatabaseValues();
    

    【讨论】:

    • 非常感谢,它救了我:)
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多