Entity Framework 核心更新未更改字段
Entity Framework Core updating unchanged fields
我不确定这是关于 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
My goal is to capture only actual changes to the record
那你不应该使用Update
方法。
根据Update
方法documentation:
Begins tracking the given entity in the Modified
state such that it will be updated in the database when SaveChanges()
is called.
All properties of the entity will be marked as modified. To mark only some properties as modified, use Attach(Object)
to begin tracking the entity in the Unchanged state and then use the returned EntityEntry
to mark the desired properties as modified.
Update
方法的主要用例是在使用 Disconnected Entities 时执行所谓的 强制更新 。由于您的 existing
实体是从上下文中检索的(或者换句话说,由上下文跟踪),因此您只需要设置新值即可。更改跟踪器将检测是否存在实际的 属性 更改,并将发出仅包含修改值的 UPDATE
命令(如果所有当前值都等于原始值,则根本不发出 UPDATE
命令)。
我不确定这是关于 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
My goal is to capture only actual changes to the record
那你不应该使用Update
方法。
根据Update
方法documentation:
Begins tracking the given entity in the
Modified
state such that it will be updated in the database whenSaveChanges()
is called.All properties of the entity will be marked as modified. To mark only some properties as modified, use
Attach(Object)
to begin tracking the entity in the Unchanged state and then use the returnedEntityEntry
to mark the desired properties as modified.
Update
方法的主要用例是在使用 Disconnected Entities 时执行所谓的 强制更新 。由于您的 existing
实体是从上下文中检索的(或者换句话说,由上下文跟踪),因此您只需要设置新值即可。更改跟踪器将检测是否存在实际的 属性 更改,并将发出仅包含修改值的 UPDATE
命令(如果所有当前值都等于原始值,则根本不发出 UPDATE
命令)。