var user = userContext.Users.First(u => u.Id == 1);
user.Name = "John";
userContext.SaveChanges();
EF
如何知道只有Name列被更改,因此创建SQL Query来更新它?
EF
如何跟踪实体?
从数据库获取实体后,它是否在实例中保留了该实体的副本,然后将其与上下文中的修改实体进行比较?
答案 0 :(得分:3)
简短的回答是肯定的。 EF保留从数据库读取的“原始”数据副本。您可以在change tracking on MSDN上阅读更多内容。
答案 1 :(得分:1)
Entity Framework可以选择为跟踪更改的每个模型生成Proxy类。从本质上讲,它使用自我跟踪属性包装对象。
基本上,你可以设想它实现了这样的东西(我不确定实际内部,但这应该对理论有所帮助,你可以反编译,如果你想看到完全它是如何完成的):
internal List<string> ChangedFields = new List<string>();
private string _name;
public string Name
{
get { return _name; }
set {
ChangedFields.Add("Name");
_name = value;
}
}
显然,对每个字段进行了复制,然后在ChangedFields
中跟踪您进行更改的每个字段。
同样,这仅仅是为了说明如何使用明确的get
/ set
,而不是特定于实体框架如何实现的属性。