【问题标题】:Detecting unchanged values using entity framework使用实体框架检测未更改的值
【发布时间】:2016-08-23 20:50:27
【问题描述】:

有没有办法,我可以解决以下情况?

我有一个如下的部门实体,它已经填充了数据。

public int ID { get; set; }
public string Name { get; set; }
public string Location { get; set; }

我正在更改名称和位置属性。 假设以下是属性的值:

Name="HR";
Location="Location1";

当数据在我的应用程序中流动时,这两个值会更改为原始值以外的值。

Name="IT";
Location="Location2";

现在,我再次将属性值设置为之前的值。

Name="HR";
Location="Location1";

在调用 context.SaveChanges() 时,EF 会触发更新查询以更新同一字段。虽然,它没有任何区别。

有没有办法,我可以防止这种情况?除了手动检查属性更改。

【问题讨论】:

    标签: entity-framework-6 dbcontext objectcontext


    【解决方案1】:

    你可以使用这个小方法来取消错误的更改:

    void MarkRealChanges(DbEntityEntry entry)
    {
        foreach (var name in entry.OriginalValues.PropertyNames)
        {
            entry.Property(name).IsModified =
                !entry.OriginalValues[name].Equals(entry.CurrentValues[name]);
        }
    }
    

    用法:

    MarkRealChanges(context.Entry(department));
    

    上下文存储它已加载的每个实体的原始值。在使用上下文时,更改跟踪器在许多情况下会执行DetectChanges,它存储实体的当前值,并在存在差异时将属性标记为已更改。显然,恢复此标记从未出现在 EF 的议程上,因此您必须手动完成。

    【讨论】:

    • 这似乎是可行的选择,但我正在寻找一些替代方案。背后的原因是,我的对象处理了近 50 个以上的属性,并且我有大量绑定到上下文的对象,这个修复确实解决了目的,但它有遍历每个属性的开销。
    • 恐怕别无选择。更改跟踪器是错误的(如果您愿意的话),所以这是修复它的地方。或者你应该完全改变你的策略并缩短上下文的生命周期。
    • 当然,您可以将此方法应用到 SaveChanges 的覆盖中,并仅循环通过修改的实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多