我使用的是實體框架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代碼優先 -
- 6. 自定義SQL函數和代碼優先(EF 4.1)
- 7. 繼承EF代碼優先
- 8. 如何在EF 4.1中執行屬性類型轉換代碼優先
- 9. MVC4 - EF代碼優先
- 10. EF 4.1中的XML數據類型代碼優先
- 11. EF代碼優先外鍵
- 12. EF代碼優先 - System.InvalidOperationException
- 13. EF 4.1上的INSERT失敗代碼優先數據庫
- 14. 將EF 4.1代碼優先模型映射到數據庫表
- 15. C#EF代碼優先 - 級聯更新
- 16. EF 4.1代碼優先初始化我的數據庫
- 17. EF 4.1代碼優先 - 在Firebird數據庫中存儲圖像
- 18. 與EF代碼優先
- 19. EF 4代碼優先和M2M2M
- 20. 用EF代碼優先鎖定
- 21. EF代碼優先:定義外鍵
- 22. MVC3:EF代碼優先和認證
- 23. EF 4.1代碼優先 - OnModel創建呼叫時間
- 24. EF代碼優先1:* 1:同款
- 25. EF 4.1代碼優先:如何設計和映射這些實體?
- 26. EF代碼優先加載不完成ICollection屬性
- 27. EF代碼優先4.3有條件加載導航屬性
- 28. EntityFramework 4.1代碼優先Oracle插入PL/SQL代碼
- 29. EF代碼優先與兩個DbContexts
- 30. 如何在EF代碼優先
很大,對我的作品與實體框架6以及! –