0
var user = userContext.Users.First(u => u.Id == 1);
user.Name = "John";
userContext.SaveChanges();

如何EF知道只有 Name 列已更改并因此创建 SQL 查询来更新它?

如何EF跟踪实体?

它是否在从数据库中获取实体后将其保留在内存中,然后将其与上下文中修改的实体进行比较?

4

2 回答 2

3

简短的回答是肯定的。EF 保留从数据库读取的数据的“原始”副本。您可以在 MSDN上阅读有关更改跟踪的更多信息。

于 2013-01-20T15:30:43.177 回答
1

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 是如何做到的。

于 2013-01-20T16:07:35.603 回答