如何跟踪未标记为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; }
)
答案 0 :(得分:1)
这是因为默认情况下启用了 自动更改 跟踪。
public YourDbContext
{
Configuration.AutoDetectChangesEnabled = true;
}
默认情况下,Entity Framework会在从Database加载所有实体时为其创建快照。当您需要将这些实体保存到数据库时,它会将所有实体的快照与其当前状态进行比较,然后根据这些实体的状态更新数据库。如果修改从DB加载的实体的任何属性,然后在db.Entry
方法或db.SaveChanges
方法之后调用,在内部它将首先调用DetectChanges方法来检测对该实体中的属性和关系所做的更改。如果它检测到某些更改,则会将状态更改为Modified
。
访问实体的更改跟踪信息的最简单方法是在DbContext上使用Entry
方法。 Entry
会返回DbEntityEntry
个实例,通过该实例,您可以访问该实体可用的信息和操作。一旦获得该实例,您就可以访问OriginalValues
和CurrentValues
属性。它们都是DbPropertyValues
类型。