3

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

修改实体时,我无法找到更改的属性。我有一个继承自 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,即使尚未将任何内容保存到数据库中。如何获取原始值以便检查属性是否已更改?

提前致谢!

4

2 回答 2

6

你可以这样做:

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";
            } 
于 2014-05-20T07:44:39.100 回答
3

罪魁祸首是这行代码:

DbSet.Attach(...)

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

于 2013-09-30T21:53:06.803 回答