2011-08-18 124 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以及! –