为什么Breeze在分离实体时重置OriginalValues哈希映射?

时间:2015-06-19 19:52:41

标签: breeze

我在项目中使用Sandboxed EntityManager和Partial Entity模式。在Sandboxed EntityManager中,我有一个完整的实体,其中包含我想要应用于我的主EntityManager的更改(已修改)。我采取的方法如下:

  1. 分离"未修改"我希望从我的主EntityManager更新的部分实体。
  2. 分离"修改"我的Sandboxed EntityManager中的完整沙盒实体。
  3. 将分离的沙箱实体附加到我的主EntityManager。
  4. 我遇到的问题是detachEntity()调用会重置我的沙盒实体上的originalValues哈希映射。我期待当我将修改后的实体重新附加到主EntityManager时 a)部分实体将被替换为完整实体而 b) EntityState仍然是&# 34;变形"并且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();
        };
    

    非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

我认为可能会发布GC的参考资料。但我想不出原始价值中的任何参考。

通过归零originalValues也没有太大的记忆力。

我们有可能试图清理甲板以进行重新安装。但是,根据附加的EntityState重新附加可以实现该选择。

  

当你重新连接修改时,我不知道微风对OV的影响。可能会或可能不会保留它。

我会让我们的一位建筑师权衡。

与此同时,你的场景有点奇特,解决方法非常明显,是吗?