【问题标题】:Why is Breeze resetting OriginalValues hash map when detaching an entity?分离实体时,为什么 Breeze 会重置 OriginalValues 哈希映射?
【发布时间】:2015-06-21 00:10:02
【问题描述】:

我在我的项目中使用沙盒实体管理器和部分实体模式。在沙盒 EntityManager 中,我有一个完整的实体,其中包含我想应用于我的主 EntityManager 的更改(修改)。我采取的方法如下:

  1. 从我的主 EntityManager 中分离我希望更新的“未修改”部分实体。
  2. 从我的沙盒实体管理器中分离“修改的”完整沙盒实体。
  3. 将分离的沙箱实体附加到我的主 EntityManager。

我遇到的问题是 detachEntity() 调用重置了我的沙盒实体上的 originalValues 哈希映射。我期望当我将修改后的实体重新附加到主 EntityManager 时,a) 部分实体将被替换为完整实体,b) EntityState 仍将是“已修改" 并且OriginalValues 哈希映射仍将包含已更改属性的列表。然而,事实并非如此。主 EntityManager 中实体的状态为“已修改”,但 originalValues 的映射为空。

因此,当我在 EntityManager 上调用 SaveChanges() 时,FULL 对象被发送回服务器,而不仅仅是变更集。

我的问题是为什么调用detachEntity()(或间接_detach() 方法)会清除originalValues 哈希映射?

这里是似乎是罪魁祸首的微风方法:

proto._detach = function () {
    this.entityGroup = null;
    this.entityManager = null;
    this.entityState = EntityState.Detached;
    this.originalValues = {}; // <!-- Why???
    this._validationErrors = {};
    this.hasValidationErrors = false;
    this.validationErrorsChanged.clear();
    this.propertyChanged.clear();
    };

非常感谢

【问题讨论】:

    标签: breeze


    【解决方案1】:

    好问题。我们为什么要这样做?

    清除它并没有错 - 分离是一个强烈的信号,表明您不再想要跟踪实体 - 但清除在语义上是必要的并不明显,而且在您的情况下肯定不方便。

    我认为可能是发布 GC 的引用。但我想不出 originalValues 中的任何引用。

    通过将 originalValues 归零,在记忆方面也没有什么好处。

    我们可能正试图清理甲板以重新连接。但该选择可能会在基于附加 EntityState 重新附加时生效。

    我不知道当您按照修改后重新附加时,微风会对 OV 产生什么影响。可能会或可能不会保留它。

    我会让我们的一位建筑师参与进来。

    同时,您的场景有点奇特,解决方法很明显,是吗?

    【讨论】:

    • 感谢沃德的回复。我们通过在重新附加后手动将 originalValues 从沙箱实体复制到主实体来解决该问题。我们发现重新附加修改后的实体时 originalValues 不会恢复,因为它们只是由于分离操作而被清除。
    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多