如何在Entity Framework Core 2.x中检测特定实体中属性的更改?

时间:2019-01-18 21:07:01

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

当用户保存对对象myObject的更改时,我想记录更新到该对象的字段。

我可以用

var myObject = await context.MyObjects.SingleAsync(x => x.Id == id);

我发现我可以得到一个IEnumerable<PropertyEntry>

var changes = context.Entry(myObject).Properties.Where(x => x.IsModified);

但是在我的changes列表中,我什么地方都看不到字段名称。另外,在LINQPad中进行此成员查询似乎需要2整秒钟。这似乎不正确。

如何完成以下声明?

Consolse.Write($"The field {what goes here?} was updated from {change.OriginalValue} to {change.CurrentCalue}.");

我发现的其他StackOverflow问题是针对Entity Framework的早期版本的,或者覆盖SaveChanges并且不查找特定的实体。

更新!知道了。

public string GetChangeLog<T>(
    ApplicationDbContext context,
    T entity)
{
    var sb = new StringBuilder();

    var changes = context.Entry(entity).Properties.Where(x => x.IsModified);

    foreach (var change in changes)
    {
        var propertyBase = (IPropertyBase)change.Metadata;
        sb.Append($"\"{propertyBase.Name}\" was changed from \"{change.OriginalValue}\" to \"{change.CurrentValue}\"\n");
    }

    return sb.ToString();
}

1 个答案:

答案 0 :(得分:1)

使用.Metadata属性检索IPropertyBase。这将告诉您实际发生了什么变化。