.net 检测实体框架EntityObject上更改的属性
我想读取.net 检测实体框架EntityObject上更改的属性,.net,entity-framework,entity-framework-4,.net,Entity Framework,Entity Framework 4,我想读取EntityObject中的更改,以便包含在报告中 例如: 名称:前后 位置:前后 有没有一种通用的方法可以做到这一点?我使用EF4生成默认的实体类(不是POCO) 这些实体将被附加,因此应跟踪它们的更改。我看不到通过IEntityWithChangeTracker界面执行此操作的方法 遍历导航属性很好,但只要报告更改的基本属性就足够了。您可以为您的实体检索ObjectStateEntry,并检查CurrentValues和OriginalValues的内容。试试这个(未经测试): 这将
EntityObject
中的更改,以便包含在报告中
例如:
名称:前后
位置:前后
有没有一种通用的方法可以做到这一点?我使用EF4生成默认的实体类(不是POCO)
这些实体将被附加,因此应跟踪它们的更改。我看不到通过IEntityWithChangeTracker
界面执行此操作的方法
遍历导航属性很好,但只要报告更改的基本属性就足够了。您可以为您的实体检索
ObjectStateEntry
,并检查CurrentValues
和OriginalValues
的内容。试试这个(未经测试):
这将不会处理导航属性,我不确定它将如何处理复杂类型。除了Ladislav Mrnka的建议之外:不是真正的通用,但至少有一个可能的解决方案:。这允许您在生成模型时向每个实体添加自己的自定义逻辑
在您的例子中,您可以实现所需的遍历功能来检查导航属性。刚刚在一些
string
属性上测试了这一点,效果很好。我确实有一些复杂的类型和导航属性,所以稍后我会尝试一下,如果我发现有什么有用的,就在这里发布。非常感谢Ladislav。@Ladislav如何使用EF6和DbContext实现这一点?顺便说一句,您的句柄打破了注释框上的自动完成。为了完整性,T4模板在这里非常值得一提,但在我看来,至少使用现有API就足够了,而且通常更容易/更安全。
ObjectStateEntry entry = objectContext.ObjectStateManager.GetObjectStateEntry(entity);
foreach (string property in entry.GetModifiedProperties()) {
object oldValue = entry.OriginalValues[property];
object newValue = entry.CurrentValues[property];
}