它是如何在内部运作的

本文关键字:在内部 | 更新日期: 2023-09-27 17:55:02

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的属性工作,而不是具体是实体框架如何做到的。