【问题标题】:EF 6 OriginalValues lost when using Attach method使用附加方法时 EF 6 OriginalValues 丢失
【发布时间】:2014-07-20 16:42:45
【问题描述】:

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

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 中有更好的方法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这对我有用。我正在使用审核并检查值。使用附加时,原始值等于使用附加时的当前值。现在使用 entity.getdatabasevalues 工作正常。
    【解决方案2】:

    原始值是从实体本身恢复的。如果实体被上下文跟踪,则此信息可用。

    在您的情况下,您使用的是断开连接的实体,因此没有更改跟踪,并且该实体没有原始值。

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

    如果您想获得一个表现得好像它已被上下文跟踪的实体,您可以使用上下文从数据库中读取实体,并使用ValueInjecter 之类的东西自动设置断开连接的属性值实体进入被跟踪实体。

    【讨论】:

    • 你完全正确!!我需要从数据库中获取原始实体,然后进行比较。不知道这是否会降低应用的性能。
    • 当然,它更慢:你两次访问数据库,这相对昂贵。但是,如果您没有该问题,请不要担心应用程序性能。换句话说:如果您没有性能问题,请不要花任何时间来提高性能。你宁愿重新利用那段时间来实现特性。如果您认为这是正确的答案,请接受它。
    猜你喜欢
    • 2016-03-17
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-09-23
    • 2019-10-22
    • 2021-10-25
    相关资源
    最近更新 更多