【问题标题】:breezejs: navigation property is created but not filled with data微风js:导航属性已创建但未填充数据
【发布时间】:2013-10-12 17:22:10
【问题描述】:

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

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

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

这里的关联是在 OpenPosition 上的任务 ID 和任务上的 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 上下文)。

查看截图:

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;

【问题讨论】:

  • 您的客户端 EntityQuery 是什么样的?
  • 当然,请参阅我的更新。就像我说的,数据是从服务器返回的。导航属性存在于 Mandate 实体上,但它保持为空,而所有其他属性都填写好了。

标签: javascript breeze


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我使用 ODATA 数据服务适配器,因为在后端我使用 WCF 数据服务。如果我切换到 WebApi 数据服务适配器,我会在尝试访问元数据时得到 404。我虽然 WebApi 数据服务适配器是为人们在后端使用 WebApi 服务而保留的,对吗?
    • 是的,没错。对困惑感到抱歉。我应该更仔细地阅读你的电子邮件。您提供什么版本的 OData?
    • 你能切换回 OData 2.0 看看它是否有所作为吗?
    • 我已经尝试使用 2.0 版本(我已经在 datajs 和服务器上更改了 MAX_DATA_SERVICE_VERSION 并确保 2.0 在标头中传递给服务器),但结果相同。导航属性的数据从服务器返回,但该属性没有被微风填充数据。
    • 大部分 OData v3 支持现在都已签入 Breeze GitHub 主分支。随意尝试并告诉我。
    【解决方案3】:

    作为后续,问题只是:

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

    :

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

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

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

    如果 (!Array.isArray(relatedRawEntities)) 返回 null;

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

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

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

    【讨论】:

    • 您看到的是 OData v 2.0 和 OData v 3.0 之间的差异。目前 Breeze 仅支持 OData v2.0。我们将在下周初发布的下一个版本中支持 v.3。现在,只需使用 DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 公开您的服务
    • 我希望它这么简单,但我怀疑这是未填充导航属性的原因:(我已经在 datajs 中将 MAX_DATA_SERVICE_VERSION 设置为“2.0”,并将服务器端的 MaxProtocolVersion 设置为 V2 . 所以也许它根本不支持微风?我可以期待下周的版本修复这个问题吗?:)
    • 抱歉,我无法在我们的任何型号上重现您的 OData v2 问题。所以我想知道还有什么不同。
    • 我已使用最新信息编辑了我的原始帖子。请注意,几个月前其他人在 SO 上报告了同样的问题:stackoverflow.com/questions/18363153/…。就我而言,我使用的是 Microsoft.Data.OData 包版本 5.0.0,但我在 InitializeService 中将 MAxProtocolVersion 设置为 2.0,所以我不确定为什么会遇到同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多