我在导航属性方面遇到了另一个问题,但这次我的配置是 WCF 数据服务 + EF。
基本上元数据看起来不错,我有引用约束、关联等...我已经在模型中设置了 [ForeignKey] 属性。
导航属性是在客户端创建的,但是当检索数据时(使用 $expand),尽管服务器确实返回了数据,但集合并未填充:
此处的关联是 OpenPosition 上的授权 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 的数组属性。
而在 WebAPI 的情况下,导航属性以数组形式返回。
请注意,在这两种情况下,都使用了相同的数据模型(EF 上下文)。
查看屏幕截图:
WCF:
WebAPI:
但是 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;
最佳答案
好吧,它终于可以工作了:)我现在正在使用 github 上最新提交的 Breezejs,这解决了我的问题。在我看来,通过 WCF 的 Breeze 直到现在才与 ODATA2 一起工作。 ODATA 规范明确说明了这一点:
- ODATA V1:集合表示为数组
- ODATA V2:集合表示为包含数组的对象。
在使用 github 版本的 Breezejs 之前,我可以让它工作的唯一方法是在 datajs 中将 MAX_DATA_SERVICE_VERSION 指定为 1.0。
无论如何,现在一切都很好。我已经等不及 Breeze 发布了 :) 顺便说一句,我很可能会放弃 OpenAccess 而转而使用 NHibernate。 NH WebAPI Controller 是否与 EF WebAPI Controller 一样完整?
关于javascript - Breeze js : navigation property is created but not filled with data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19060244/