【发布时间】:2011-08-18 21:23:53
【问题描述】:
我使用的是 Entity Framework 4.1 Code First。是否有内置方法来获取自从数据库加载实体以来发生了哪些属性更改的列表?我知道代码首先检测到对象已更改,但有没有办法准确获取已更改的属性?
【问题讨论】:
标签: c# entity-framework code-first change-tracking
我使用的是 Entity Framework 4.1 Code First。是否有内置方法来获取自从数据库加载实体以来发生了哪些属性更改的列表?我知道代码首先检测到对象已更改,但有没有办法准确获取已更改的属性?
【问题讨论】:
标签: c# entity-framework code-first change-tracking
对于标量和复杂属性,您可以使用以下内容提取实体myEntity的更改属性名称:
var entry = context.Entry(myEntity);
var namesOfChangedProperties = entry.CurrentValues.PropertyNames
.Where(p => entry.Property(p).IsModified);
这里有几点需要注意:
CurrentValues.PropertyNames 仅包含标量和复杂属性,不包含导航属性。
复杂属性意味着:只有在实体上声明的复杂属性的名称,而不是复杂类型本身的实际单个属性,例如:如果你有这个模型......
[ComplexType]
public class Address
{
public string Country { get; set; }
public string City { get; set; }
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
...那么,如果myEntity 是Person,CurrentValues.PropertyNames 将包含“Id”、“Name”和“Address ”,但不是“Address.Country”或“Address.City”(也不是“Country”或“City ”)。
Country 和 City)是否已更改。或者复杂类型的任何属性已更改(Country 或 City 已更改)。我相信不可能找出哪一个,因为 EF 总是向数据库发送 all 复杂类型属性的 UPDATE 命令,即使只有一个属性发生了变化,而另一个属性保持不变。我会由此得出结论,EF 不会跟踪单个复杂类型属性的变化。
【讨论】: