【问题标题】:Why do the original values of a DbEntityEntry match the new values?为什么 DbEntityEntry 的原始值与新值匹配?
【发布时间】:2013-09-27 16:13:02
【问题描述】:

我正在尝试按照这篇文章http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit-logging/ 在我的带有 EF 应用程序的 MVC 4 中实施审计。

我在修改实体时无法找到更改的属性。我有一个继承自 DbContext 并覆盖 SaveChanges 方法的类。在这个新的 SaveChanges 方法中,我有以下代码来查找更改的属性,其中实体来自 ChangeTracker.Entities()。

foreach (var propertyName in entity.OriginalValues.PropertyNames)
{
    var originalValue = entity.OriginalValues.GetValue<object>(propertyName);
    var newValue = entity.CurrentValues.GetValue<object>(propertyName);

    if (!object.Equals(originalValue, newValue))
    {
        // Insert an auditing record.
    }
}

这个问题是 originalValue 始终等于 newValue,即使尚未将任何内容保存到数据库中。如何获取原始值以便检查属性是否已更改?

提前致谢!

【问题讨论】:

  • 显示您的客户端代码(实际上会更改属性值),您的完整 SaveChanges() 代码也可能会有所帮助。
  • 在检查更改之前,您可能需要致电context.ChangeTracker.DetectChanges ...

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


【解决方案1】:

你可以这样做:

foreach (var propertyName in entity.OriginalValues.PropertyNames)
            {
                String originalValue = "";
                String newValue = "";

                originalValue = entity.GetDatabaseValues().GetValue<object>(propertyName).ToString();

                newValue = entity.CurrentValues.GetValue<object>(propertyName).ToString();

                changes += propertyName.ToString() + " : " + originalValue + " --> " + newValue + "\n";
            } 

【讨论】:

    【解决方案2】:

    罪魁祸首就是这行代码:

    DbSet.Attach(...)

    这个函数的总结(来自System.Data.Entity.IDbSet)是:“将给定的实体附加到集合底层的上下文中。也就是说,实体以Unchanged状态被放置到上下文中,就像它已经被读取一样来自数据库。”

    【讨论】:

    • 您能否更具体地说明这实际上如何有助于获取实体上的更改?
    • 在您检查更改之前调用 DbSet.Attach(entity) 清除所有更改
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多