代码之家  ›  专栏  ›  技术社区  ›  Christopher

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

  •  2
  • Christopher  · 技术社区  · 6 年前

    当用户保存对对象的更改时 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问题是针对以前版本的实体框架,或者重写 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 回复  |  直到 6 年前
        1
  •  1
  •   Daniel A. White    6 年前

    使用 .Metadata 要检索的属性 IPropertyBase . 这将告诉你到底发生了什么变化。