1

设想:

我在我们的 SPA 中使用微风进行查询,在 POST PUT DELETE 方法中使用原始 http 方法。资源上的 POST 方法返回创建的资源,包括它创建的子对象。

我想将此创建的资源附加到 beeeze 实体管理器。

我尝试使用添加实体

manager.createEntity('Driver', data, breeze.EntityState.Unchanged);

其中数据对象包含驱动程序资源和相关子实体的数组。

但是遇到一个例外:“可能未设置集合导航属性。”

我必须手动创建本地实体并附加子实体还是微风支持这种情况?

4

1 回答 1

1

此异常的原因是“createEntity”方法创建实体,然后将您的“数据”分配给它,但对于任何集合导航属性,该集合已经存在,Breeze 不允许您替换它。对于应用程序的其他部分可能持有对集合的引用的现有实体来说,这是一个深思熟虑的选择,但在这种情况下,您是“第一个”访问该集合的人就显得过分了。目前,解决方法是更新任何导航集合而不是替换它们。

因此,最简单的方法是调用 createEntity 方法而不使用任何集合数据属性,然后将数据推送到您的集合中

var driver = manager.createEntity('Driver', dataWithoutCollections, EntityState.Unchanged)
// then update collection properties by pushing into them.
trafficFines.forEach(function(trafficFine) {  
   driver.trafficFines.push(trafficFine);      // or use push.apply
};

请注意,添加到实体的集合属性不会导致 EntityState 更改,因此这应该足够了。

基于此问题,我将添加一个功能请求以在您调用“createEntity”方法的情况下抑制此异常,因为应用程序的其他部分已经可以访问新实体并没有危险。

于 2013-04-11T07:07:24.670 回答