var user = userContext.Users.First(u => u.Id == 1);
user.Name = "John";
userContext.SaveChanges();
如何EF
知道只有 Name 列已更改并因此创建 SQL 查询来更新它?
如何EF
跟踪实体?
它是否在从数据库中获取实体后将其保留在内存中,然后将其与上下文中修改的实体进行比较?
var user = userContext.Users.First(u => u.Id == 1);
user.Name = "John";
userContext.SaveChanges();
如何EF
知道只有 Name 列已更改并因此创建 SQL 查询来更新它?
如何EF
跟踪实体?
它是否在从数据库中获取实体后将其保留在内存中,然后将其与上下文中修改的实体进行比较?
简短的回答是肯定的。EF 保留从数据库读取的数据的“原始”副本。您可以在 MSDN上阅读有关更改跟踪的更多信息。
Entity Framework 可以选择为每个跟踪更改的模型生成一个代理类。本质上,它使用自跟踪属性包装对象。
基本上,你可以设想它实现了这样的东西(我不确定实际的内部结构,但这应该对理论有所帮助,如果你想看看它是如何完成的,你可以反编译):
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
,而不是具体说明 Entity Framework 是如何做到的。