Entity Framework Core 更新未更改的字段

4

我不确定这是关于Entity Framework还是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

获取实体状态在每次更改时非常容易。想象一下,您有一个实体,并且已经修改了100次。您只需要在特定时间获取此实体的状态即可。否则,获取此类信息将会很复杂。 - Vivek Nuna
我不确定你在说什么。如果OriginalValue和NewValue相同,我不想捕获它们。 - Chris
1个回答

10
我的目标是仅捕获记录的实际更改。 那么你不应该使用Update方法。 根据Update方法documentation: 开始跟踪给定实体的Modified状态,以便在调用SaveChanges()时更新它。 所有实体的属性都将被标记为修改过。要仅标记某些属性为修改过,请使用Attach(Object)开始跟踪Unchanged状态下的实体,然后使用返回的EntityEntry将所需属性标记为修改过。 Update方法的主要用例是在使用Disconnected Entities时执行所谓的强制更新。由于您的existing实体是从上下文中检索到的(或者换句话说,由上下文跟踪),因此您所要做的就是设置新值。更改跟踪器将检测是否存在实际的属性更改,并仅使用修改后的值发出UPDATE命令(如果所有当前值均等于原始值,则根本不会有UPDATE命令)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接