breezejs:导航属性已创建但未填充数据

时间:2013-09-27 21:20:39

标签: javascript breeze

我还有导航属性的另一个问题,但这次我的配置是WCF数据服务+ EF。

基本上元数据看起来很好,我有参考约束,关联等...我在模型中设置了[ForeignKey]属性。

导航属性是在客户端创建的,但是当检索数据时(使用$ expand),尽管服务器肯定返回了数据,但未填充集合:

enter image description here

这里的关联是在OpenPosition上的mand_id和Mandate上的id之间。

我注意到OpenPositions集合中的Mandate实体包含__deferred与实体的uri。我没有在WebApi上看到过,所以也许这就是问题,或者这可能只是正常行为。

有什么我想念的吗?

修改

客户端查询是:

  var query = breeze.EntityQuery.from("Mandates").inlineCount().expand("OpenPositions");
  return manager.executeQuery(query.using(service)).then(function (result) {
        logger.info(result);
    }).fail(function (error) {
        logger.error(error);
    });

编辑2

未填充导航属性的原因是因为在WCF数据服务的情况下,导航属性作为对象返回,该对象包含名为results的Array属性。

而在WebAPI的情况下,导航属性作为数组返回。

请注意,在这两种情况下,都使用了相同的数据模型(EF上下文)。

查看截图:

WCF:

enter image description here

的WebAPI:

enter image description here

但是breeze需要一个数组,否则它会忽略导航属性并返回null:

   // needed if what is returned is not an array and we expect one - this happens with __deferred in OData.
        if (!Array.isArray(relatedRawEntities)) return null;

3 个答案:

答案 0 :(得分:2)

好的,最后它正在工作:)我现在在github上使用最新的breezejs提交,这解决了我的问题。在我看来,通过WCF的微风直到现在才使用ODATA2。 ODATA规范很清楚:

  • ODATA V1:集合表示为数组
  • ODATA V2:集合表示为包含数组的对象。

在使用greezeub版本的breezejs之前,我能让它工作的唯一方法是在datajs中将MAX_DATA_SERVICE_VERSION指定为1.0。

无论如何,这一切都很好。我等不及微风释放:)顺便说一句,我可能会抛弃OpenAlccess for NHibernate。 NH WebAPI控制器是否与EF WebAPI控制器一样完整?

答案 1 :(得分:0)

您使用的是“WebApi”数据服务适配器还是“OData”数据服务适配器?通常,您应该使用“webApi”数据服务适配器,除非您通过OData明确公开您的数据。 “webApi”适配器是默认适配器,因此我尝试删除任何提及“OData”的“initializeAdapterReference”调用。

答案 2 :(得分:0)

作为后续行动,问题就是:

- 使用经典的ODATA服务,导航属性嵌入在名为“结果”的对象中。

enter image description here

对于WebAPI服务,导航属性只是一个数组。

enter image description here

然后在微风代码的某个时刻,有以下测试:

 // needed if what is returned is not an array and we expect one - this happens with __deferred in OData.

if(!Array.isArray(relatedRawEntities))返回null;

并且在经典ODATA服务的情况下,它显然返回null并且不填充导航属性。

我不知道如何使自己更清楚。它看起来不像我的元数据有问题,但更像是微风中的错误。

你能证实我说的是有道理的吗?我们能为此做些什么吗?