情景:
我使用breeze在我们的SPA和查询POST PUT DELETE方法的原始http方法中查询。 资源上的POST方法返回创建的资源,包括它创建的子对象。
我想将此创建的资源附加到beeze实体管理器。
我尝试使用
添加实体manager.createEntity('Driver', data, breeze.EntityState.Unchanged);
其中数据对象包含驱动程序资源和相关子实体数组。
但是获得例外:“可能未设置集合导航属性。”
我是否必须手动创建本地实体并附加子实体或者是否支持这种情况?
答案 0 :(得分: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'方法的情况下禁止此异常,因为应用程序的某些其他部分已经无法访问新的实体。