【问题标题】:Detect which properties changed on an Entity Framework EntityObject检测实体框架 EntityObject 上更改了哪些属性
【发布时间】:2012-08-14 13:16:31
【问题描述】:

我想阅读 EntityObject 中的更改以包含在报告中。

例如:

姓名: 之前之后

地点: 之前之后

有没有通用的方法来做到这一点?我正在使用带有默认实体类生成的 EF4(不是 POCO)。

这些实体将被附加,因此应跟踪它们的更改。我看不到通过IEntityWithChangeTracker 接口执行此操作的方法。

遍历导航属性会很好,但仅报告更改的原始属性就足够了。

【问题讨论】:

    标签: .net entity-framework entity-framework-4


    【解决方案1】:

    您可以为您的实体检索ObjectStateEntry 并检查CurrentValuesOriginalValues 的内容。试试这个(未经测试):

    ObjectStateEntry entry = objectContext.ObjectStateManager.GetObjectStateEntry(entity);
    foreach (string property in entry.GetModifiedProperties()) {
        object oldValue = entry.OriginalValues[property];
        object newValue = entry.CurrentValues[property];
    }
    

    这不会处理导航属性,我不确定它如何处理复杂类型。

    【讨论】:

    • 刚刚在string 的一些属性上进行了测试,效果很好。我确实有一些复杂的类型和导航属性,所以稍后会尝试一下,如果我发现任何有用的东西会在这里发布。非常感谢拉迪斯拉夫。
    • @Ladislav 如何使用 EF6 和 DbContext 实现这一目标?顺便说一句 - 您的句柄会破坏评论框上的自动完成功能。
    【解决方案2】:

    除了 Ladislav Mrnka 的建议:不是很通用,但至少是一个可能解决方案:Code Generation and T4 Text Templates。这允许您在生成模型时向每个实体添加自己的自定义逻辑。

    在您的情况下,您可以实现所需的遍历功能来检查导航属性。

    【讨论】:

    • T4 模板在此处绝对值得一提,但至少在我看来,使用现有的 API 就足够了,而且通常更容易/更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多