实体框架核心更新未更改的字段

时间:2018-05-15 14:46:13

标签: entity-framework-core audit.net

我不确定这是关于实体框架的问题,还是audit.net库的工作方式,但我猜测这与我使用EF进行更新的方式有关。我的目标是仅捕获对记录的实际更改,但它将所有内容都捕获为更改,即使旧值和新值相同。

基本上要尽可能地简化它,如果我这样做

var existing = context.Appl.FirstOrDefault(a => a.Id == id);
context.Appl.Update(existing);
context.SaveChanges();

(什么都不做)

Audit.Net更改日志表示每个字段都已更改,看起来像

   "Changes": [
      {
        "ColumnName": "FOO",
        "OriginalValue": "",
        "NewValue": ""
      },
      ..... many more

1 个答案:

答案 0 :(得分:5)

  

我的目标是只捕获对记录的实际更改

然后你不应该使用Update方法。

根据Update方法documentation

  

开始跟踪Modified状态的给定实体,以便在调用SaveChanges()时在数据库中更新它。

     

该实体的所有属性都将标记为已修改。要仅将某些属性标记为已修改,请使用Attach(Object)开始跟踪处于“未更改”状态的实体,然后使用返回的EntityEntry将所需属性标记为已修改。

Update方法的主要用法是在使用Disconnected Entities时执行所谓的强制更新。由于您的existing实体是从上下文中检索的(换句话说,由上下文跟踪),因此您只需要设置新值。更改跟踪器将检测是否存在实际的属性更改,并且如果所有当前值都等于原始值,则将仅发出UPDATE命令仅包含修改后的值(或者根本没有UPDATE命令。)