c# – EF 4.1程式碼優先 – 確定哪些屬性已更改
我正在使用Entity Framework 4.1 Code First.是否有內建的方式來獲取從資料庫載入實體以來哪些屬性已更改的列表?我知道程式碼首先檢測到一個物件被改變了,但是有沒有辦法得到什麼屬性已經改變了?
對於標量和複雜屬性,您可以使用以下內容來提取更改的實體屬性名稱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是一個人,CurrentValues.PropertyNames將包含“Id”,“Name”和“Address”,但不包含“Address.Country”或“Address.City”(或“Country”或“City”) .
>如果一個複雜的屬性被標記為已修改(在上面的程式碼中的IsModified是true),那麼這意味著引用(上面示例中的Person.Address)已經改變,無論實際的屬性值(Country和City)內部的複雜型別有沒有改變.或者複合型別的任何屬性已更改(國家或城市已更改).我相信不可能找出哪一個,因為EF總是向資料庫傳送所有複雜型別屬性的UPDATE命令,即使只有一個屬性已更改,另一個屬性保持不變.我從此得出結論,EF不追蹤單個複雜型別屬性的變化.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/7114333/ef-4-1-code-first-determine-what-properties-have-changed