我使用的是實體框架4.1代碼優先。是否有一種內置方法可以獲得自實體從數據庫加載後屬性發生更改的列表?我知道代碼首先檢測到對象已更改,但是有沒有辦法確切地得到哪些屬性發生了變化?EF 4.1代碼優先 - 確定哪些屬性已更改
16
A
回答
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; } }
...那麼,如果
myEntity
是Person
,CurrentValues.PropertyNames
將包含 「標識」, 「名稱」 和 「地址」,而不是 「Address.Country」 或「Address.City 「(也不是」 國家 「或」 市「)。如果作爲改性的複合屬性標記(
.IsModified
在上面的代碼是true
),那麼這意味着該參考(Person.Address
在上面的例子中)發生了改變,不管實際的屬性值(Country
和City
)內部的複雜類型已經改變或沒有。或者複雜類型的任何屬性已更改(Country
或City
已更改)。我認爲這是不可能找出哪一個,因爲EF總是發送UPDATE命令所有複雜類型的屬性到數據庫中,即使只有一個屬性發生了變化,而另一個保持不變。我會從中得出結論,EF不會跟蹤個別複雜類型屬性的更改。
相關問題
- 1. EF 4.1代碼優先 - 使用[必需的]屬性更新
- 2. EF代碼優先4.1 xml XElement
- 3. EF代碼優先的子查詢4.1
- 4. EF 4.1代碼優先 - 添加列
- 5. EF 4.1代碼優先映射問題
- 6. EF 4.1代碼優先:爲什麼EF不設置此導航屬性?
- 7. EF代碼優先:更改使用MySQL
- 8. EF代碼優先 -
- 9. EF 4.1代碼優先:觸發更新多對多
- 10. 自定義SQL函數和代碼優先(EF 4.1)
- 11. 繼承EF代碼優先
- 12. EF 4.1代碼優先SQL CE 4.0更新集合例外
- 13. 用Winforms和EF 4.1進行數據綁定代碼優先
- 14. MVC4 - EF代碼優先
- 15. 如何在EF 4.1中執行屬性類型轉換代碼優先
- 16. 使用EF 4.1插入不保存代碼優先
- 17. 使用EF代碼優先指定小數位作爲屬性
- 18. EF代碼優先流利的API指定外鍵屬性
- 19. EF代碼優先和確認字段
- 20. EF代碼優先外鍵
- 21. EF 4.1中的XML數據類型代碼優先
- 22. EF代碼優先 - System.InvalidOperationException
- 23. EF 4.1上的INSERT失敗代碼優先數據庫
- 24. 將EF 4.1代碼優先模型映射到數據庫表
- 25. EF代碼優先多對多更新
- 26. C#EF代碼優先 - 級聯更新
- 27. EF 4.1代碼優先初始化我的數據庫
- 28. 與EF代碼優先
- 29. 在EF代碼優先
- 30. EF 4.1代碼優先 - 在Firebird數據庫中存儲圖像
很大,對我的作品與實體框架6以及! –