使用Attach方法时,EF 6 OriginalValues丢失

时间:2014-05-30 20:18:38

标签: entity-framework entity-framework-4.1 audit-trail

我的实体有以下更新通用方法:

public void Update < T > (T entity) where T: class {
    DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
    if (dbEntityEntry.State == System.Data.Entity.EntityState.Detached) {

        DbContext.Set < T > ().Attach(entity);

    }
    dbEntityEntry.State = System.Data.Entity.EntityState.Modified;
}

SaveChanges()数据在数据库中成功更新后。

现在我需要在SaveChanges()之前实施和审核日志,但我注意到CurrentValues等于OriginalValues

// For updates, we only want to capture the columns that actually changed
if (!object.Equals(dbEntry.OriginalValues.GetValue<object>(propertyName), dbEntry.CurrentValues.GetValue<object>(propertyName))){

  //here I add a new Audit Log entity

}

有关如何解决此问题的任何线索?或者在Entity Framework 6中有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

从实体本身恢复原始值。如果正在通过上下文跟踪实体,则可以使用此信息。

在您的情况下,您使用的是已删除的实体,因此没有更改跟踪,并且实体没有原始值。

所以,在这种情况下,如果您需要原始值,除了从数据库中获取它们之外别无选择,并逐一进行比较。

如果您想获得一个行为就好像它已被上下文跟踪的实体,您可以使用上下文从数据库中读取实体,并使用ValueInjecter之类的内容自动设置属性值被取消的实体进入被跟踪的实体。

答案 1 :(得分:0)

如果使用断开连接的实体,则可以设置原始值而不影响实体实例值,请根据需要调整此方法

public static void LoadOriginalValues(this WorkflowsContext db, DbEntityEntry entity) 
        {
            var props = entity.GetDatabaseValues();

            foreach (var p in props.PropertyNames)
            {
                if (entity.Property(p).IsModified)
                {
                    entity.Property(p).OriginalValue = props[p];
                }
            }
        }