2011-08-18 107 views
16

我使用的是实体框架4.1代码优先。是否有一种内置方法可以获得自实体从数据库加载后属性发生更改的列表?我知道代码首先检测到对象已更改,但是有没有办法确切地得到哪些属性发生了变化?EF 4.1代码优先 - 确定哪些属性已更改

回答

28

对于您可以使用以下方法来提取实体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; } 
    } 
    

    ...那么,如果myEntityPersonCurrentValues.PropertyNames将包含 “标识”, “名称” 和 “地址”,而不是 “Address.Country” 或“Address.City “(也不是” 国家 “或” “)。

  • 如果作为改性的复合属性标记(.IsModified在上面的代码是true),那么这意味着该参考(Person.Address在上面的例子中)发生了改变,不管实际的属性值(CountryCity )内部的复杂类型已经改变或没有。或者复杂类型的任何属性已更改(CountryCity已更改)。我认为这是不可能找出哪一个,因为EF总是发送UPDATE命令所有复杂类型的属性到数据库中,即使只有一个属性发生了变化,而另一个保持不变。我会从中得出结论,EF不会跟踪个别复杂类型属性的更改。

+2

很大,对我的作品与实体框架6以及! –