它是如何在内部工作的

时间:2013-01-20 15:24:55

标签: c# entity-framework-5

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

EF如何知道只有Name列被更改,因此创建SQL Query来更新它?

EF如何跟踪实体?

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

2 个答案:

答案 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而不是特定于实体框架如何实现的属性。