为什么DbEntityEntry的原始值与新值匹配?

时间:2013-09-22 19:24:11

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

我正在尝试根据此帖http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit-logging/在我的MVC 4中使用EF应用程序实施审核。

在修改实体时,我无法找到更改的属性。我有一个继承自DbContext的类并重写了SaveChanges方法。在这个新的SaveChanges方法中,我有以下代码来查找已更改的属性,其中entity来自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,即使还没有保存到数据库中。如何获取原始值以便检查属性是否已更改?

提前致谢!

2 个答案:

答案 0 :(得分:5)

你可以这样做:

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";
            } 

答案 1 :(得分:3)

罪魁祸首就是这行代码:

DbSet.Attach(...)

此函数的摘要(来自System.Data.Entity.IDbSet)是:“将给定实体附加到集合下的上下文。也就是说,实体被置于Unchanged状态的上下文中,就像它具有已从数据库中读取。“