【问题标题】:How to tell which properties have changed on an EF Core Entity?如何判断 EF Core 实体上的哪些属性发生了变化?
【发布时间】:2020-09-18 23:17:33
【问题描述】:

我有一个项目,我需要记录已更改的“列”以及原始值和更改后的值。我有一个 EF Core 实体,所以我尝试执行以下测试:

var existing = _context.People.FirstOrDefault(p => p.Id == 5);
existing.Lastname += " III";

var changes = new List<Tuple<string,object,object>>();
var proplist = typeof(Person).GetProperties();
foreach(var prop in proplist)
{
   var orig = _context.Entry(existing).OriginalValues[prop.Name];
   var curr = _context.Entry(existing).CurrentValues[prop.Name];
   if(orig != curr){
     changes.Add(new Tuple<string,object,object>(prop.Name,orig,curr));
   }
} 

我希望只是在我的更改中看到“姓氏”。但是,我得到了一些奇怪的东西,比如 Birthdate(DateTime 值)、Id(int 值)等。奇怪的是这些条目的 orig 值和 curr 值完全相同——也就是说,我在更改中的条目表格如下:"Id",2,2

我做错了什么还是有更可靠的方法来查找实体的哪些属性发生了变化?

【问题讨论】:

  • 你试过检查context.ChangeTracker.Entries()吗?
  • 我希望_context.Entity(existing)_context.Entry(existing) 的拼写错误,而不是您原始代码的一部分。

标签: c# entity-framework-core


【解决方案1】:

你可以试试这个-

var changes = new List<Tuple<string, object, object>>();
var entry = _context.Entry(existing);
foreach (var item in entry.CurrentValues.Properties)
{
    var propEnrty = entry.Property(item.Name);
    if (propEnrty.IsModified)
    {
        changes.Add(new Tuple<string, object, object>(item.Name, propEnrty.OriginalValue, propEnrty.CurrentValue));
    }
}

编辑:
我刚刚运行了你的代码,没有发现任何问题。以下是我在changes 列表中得到的内容-

{(LastName, Cooper, Cooper III)}

但我当然使用了_context.Entry(existing),希望_context.Entity(existing) 在发布时是一个错字,并不是你原始代码的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多