我使用的是实体框架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以及! –