EF:如何工作EntityState跟踪不是“虚拟”属性

时间:2015-02-03 18:40:53

标签: .net entity-framework

如何跟踪未标记为virtual的属性的EntityState?

这里的例子:

var person = db.Persons.First();
person.Name = "bla bla";
Console.WriteLine(db.Entry(person).State);  //Output: Modified. How he know??

班级结构:

class Person
{
    public int id { get; set; }
    public string Name { get; set; }
)

1 个答案:

答案 0 :(得分:1)

这是因为默认情况下启用了 自动更改 跟踪。

public YourDbContext
{
  Configuration.AutoDetectChangesEnabled = true;
}

默认情况下,Entity Framework会在从Database加载所有实体时为其创建快照。当您需要将这些实体保存到数据库时,它会将所有实体的快照与其当前状态进行比较,然后根据这些实体的状态更新数据库。如果修改从DB加载的实体的任何属性,然后在db.Entry方法或db.SaveChanges方法之后调用,在内部它将首先调用DetectChanges方法来检测对该实体中的属性和关系所做的更改。如果它检测到某些更改,则会将状态更改为Modified

访问实体的更改跟踪信息的最简单方法是在DbContext上使用Entry方法。 Entry会返回DbEntityEntry个实例,通过该实例,您可以访问该实体可用的信息和操作。一旦获得该实例,您就可以访问OriginalValuesCurrentValues属性。它们都是DbPropertyValues类型。