我正在使用Entity Framework 4.1 Code First。是否有内置方法来获取自从数据库加载实体以来哪些属性已更改的列表?我知道代码首先检测到对象已被更改,但有没有办法确切地获取哪些属性已更改?
答案 0 :(得分:29)
对于标量和复杂属性,您可以使用以下内容提取实体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 ”,“名称”和“地址”但不是“地址。国家”或“地址。城市”(也不是“国家”或“城市”)。
如果复杂属性被标记为已修改(上面代码中的.IsModified
为true
),则表示上述示例中的引用(Person.Address
)具有无论实际上复杂类型内的属性值(Country
和City
)是否已更改,都会更改。或者复杂类型的任何属性已更改(Country
或City
已更改)。我认为找不到哪一个是不可能的,因为EF总是向数据库发送所有复杂类型属性的UPDATE命令,即使只有一个属性发生了变化而另一个属性保持不变。我将从中得出结论,EF不会跟踪单个复杂类型属性的变化。