【发布时间】:2019-08-13 03:02:01
【问题描述】:
假设我们有一个 Person 类(具有 Id 和 Age 属性),假设我们需要将 id 为 1 的人的 Age 从 29 更改为 30,
Person p = new Person(){ Id = 1 } //Age is default to 0 here, but does't matter, because it is going to be changed later
var entity = context.Persons.Attach(p);
p.Age = 30;
Console.WriteLine("entity state:" + entity.State);
foreach (var modifiedProperty in entity.Properties.Where(p => p.IsModified))
{
Console.Write($"The {modifiedProperty.Metadata.Name} property is marked as modified");
}
context.SaveChanges();
输出显示:
entity.State 未更改并且没有属性被标记为已修改,但 EF 核心仍然生成了一个更新 SQL 来设置 [Age] = 30,我是困惑,如果实体状态不变,EF核心认为没有属性修改,那么EF核心不应该生成Update SQL吗?
如果我使用 Update() 方法而不是 Attach()
...
var entity = context.Persons.Update(p);
...
那么一切正常,Entity状态被修改,Age被标识为修改属性?
【问题讨论】:
-
myContext.ChangeTracker.DetectChanges();
-
@JohnB 我更新了我的帖子。那么为什么使用 Update() 方法可以识别修改的属性而 Attach() 不能呢?