使用manager.createEntity创建包含navigationproperties的Breeze实体会引发异常

时间:2013-04-10 11:55:56

标签: entity-framework asp.net-web-api breeze

情景:

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

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

我尝试使用

添加实体
manager.createEntity('Driver', data, breeze.EntityState.Unchanged);

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

但是获得例外:“可能未设置集合导航属性。”

我是否必须手动创建本地实体并附加子实体或者是否支持这种情况?

1 个答案:

答案 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'方法的情况下禁止此异常,因为应用程序的某些其他部分已经无法访问新的实体。