2

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

基本上元数据看起来不错,我有引用约束、关联等...我在模型中设置了 [ForeignKey] 属性。

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

在此处输入图像描述

这里的关联是在 OpenPosition 上的 task_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 Dataservice 的情况下,导航属性作为对象返回,该对象包含一个名为 results 的 Array 属性。

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

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

见截图:

周转基金:

在此处输入图像描述

网络接口:

在此处输入图像描述

但是微风需要一个数组,否则它只是忽略导航属性并返回 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;
4

3 回答 3

2

好的,终于可以正常工作了:)我现在正在使用 github 上的最新提交的轻柔js,这解决了我的问题。在我看来,通过 WCF 的微风直到现在才与 ODATA2 一起使用。ODATA 规范对此很清楚:

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

在使用微风js的github版本之前,我可以让它工作的唯一方法是在datajs中将MAX_DATA_SERVICE_VERSION指定为1.0。

无论如何,现在一切都很好。我等不及要发布了 :) 顺便说一句,我可能会放弃 OpenAccess 转而使用 NHibernate。NH WebAPI 控制器是否与 EF WebAPI 控制器一样完整?

于 2013-10-12T09:22:10.070 回答
0

您使用的是“WebApi”数据服务适配器还是“OData”数据服务适配器?通常,除非您通过 OData 显式公开数据,否则您应该使用“webApi”数据服务适配器。“webApi”适配器是默认的,所以我会尝试删除任何提到“OData”的“initializeAdapterReference”调用。

于 2013-10-03T20:00:37.817 回答
0

作为跟进,问题只是:

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

在此处输入图像描述

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

在此处输入图像描述

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

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

if (!Array.isArray(relatedRawEntities)) 返回空值;

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

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

你能确认我说的有道理吗?我们能做点什么吗?

于 2013-10-10T11:35:25.813 回答