breeze:getEntityGraph中出现意外错误

breeze:getEntityGraph中出现意外错误,breeze,Breeze,我使用getEntityGraph扩展,除以下情况外,它工作正常: 添加新实体 不保存它并调用实体上的setDeleted 通过将实体和np集合作为参数传递来调用getEntityGraph 调用makePathSegmentFn时,它会在此行崩溃: grps.forEach(function(grp) { vals = vals.concat(grp._entities.filter(function (en) { return en.getProperty(fkNa

我使用getEntityGraph扩展,除以下情况外,它工作正常:

  • 添加新实体
  • 不保存它并调用实体上的setDeleted
  • 通过将实体和np集合作为参数传递来调用getEntityGraph
  • 调用makePathSegmentFn时,它会在此行崩溃:

     grps.forEach(function(grp) {
         vals = vals.concat(grp._entities.filter(function (en) {
           return en.getProperty(fkName) === keyValue;         
       }));
     });
    
    en
    为空,因此会引发异常。我已经通过检查en是否为null来解决这个问题,并且每一个都可以正常工作。但是如果它是一个bug,也许应该在原始代码中这样做?请注意,在np集合中的所有实体中,只有一个实体为空。我想这是被删除的,但不能确定。

    2014年4月29日更新 好的。。。我现在明白了。您所说的是删除的子实体,而不是分离的根实体

    感谢您识别此错误。我在DocCode中添加了这个场景的测试,然后修复了这个bug。这两项更改都推送到github。它们将出现在下一个官方版本中。你现在可以

    原始答案 我不能重复你描述的那种失败。。。因为
    getEntityGraph
    在到达
    makePathSegmentFn
    之前很久就会抛出它应该这样做

    getEntityGraph
    应该在传入的任何根实体“分离”时引发异常(例如,“getEntityGraph”根[0]是分离的实体)

    当您创建一个新实体并立即将其删除(不首先保存)时,其状态将从“已添加”更改为“已分离”;它不再是缓存中的实体。这是预期的行为(请参阅中的“EntityState转换”)。这就是我完全按照你的复制步骤做的


    请提供一个jsFiddle或plunker来演示错误。

    稍后我将尝试创建一个plunker,但问题是:我们有一个根实体和其他实体的集合。我们创建一个实体并将其添加到根的子级。然后,我们对该实体执行setdeleted()。现在,如果您尝试使用getEntityGraph,它将抛出一个异常,因为_entityGroupMap将包含一个null条目和一个相关的_EmptyIndex条目。因此,在getEntityGraph的makePathSegmentFn中检查实体是否为null就可以做到这一点。抱歉,如果不清楚的话,我在这里尝试了测试:我也有同样的错误。只有在删除处于“已添加”状态的实体时,才会发生这种情况。它链接到setDeleted方法,该方法对新创建的实体执行detachEntity操作。因此,当删除一个新实体(在客户端创建)时,它将丢失并且无法检索(因为它在groupMap中设置为null)。我说得对吗?