【问题标题】:EntityAspect property still not avail after adding an expand clause to a BreezeJS query向 BreezeJS 查询添加扩展子句后,EntityAspect 属性仍然无效
【发布时间】:2014-12-11 03:43:57
【问题描述】:

这是 Ziad 在 2013 年 11 月 13 日提出的问题的后续。他的问题是在 BreezeJS 中添加扩展子句后 EntityAspect 属性不再可用。此功能似乎在 V1.4.3 中有效,但在使用 EF6 和 WebApi2 升级到 V1.4.5 后,此功能不再可用。我们现在有一个 V1.5、EF 6.1.1 和 WebApi 2.2 的 Breeze 客户端,但功能仍然没有恢复。我的问题是:是否会恢复此功能,如果没有,是否有可用的解决方法。除非我能找到解决这个问题的方法,否则我有一个基于 Breeze、Knockout、Durandal 的主要应用程序,它实际上已经死在水中了。

我窃取了 Ziad 示例代码。我希望他不介意,因为它清楚地说明了问题。 此代码工作正常:

var query = breeze.EntityQuery.from("Products").take(1);

该行的 EntityAspect 属性可用。

但是,当他添加了一个扩展子句时:

var query = breeze.EntityQuery.from("Products").expand("Orders").take(1);

这是 Ziad 用于检索数据的代码:

var mgr = new breeze.EntityManager(rootUrl + 'breeze/ProductsApi');
mgr.executeQuery(query, function (data) {
alert(data.results[0].entityAspect); // undefined.
});

该行的 EntityAspect 属性现在未定义,检索到的字段显示为纯值而不是 KnockoutJS 类型的 observables。

我能够解决检索到的字段显示为纯文本的问题。我相信这是因为我使用了 ko.observableArray 而不是 ko.observable。但是 EntityAspect 不能处理扩展结构的问题是一个大问题。我无法让我的 UI 和我的底层 Breeze 缓存保持同步。我的 SaveChanges 功能似乎确实可以可靠地工作。试图完成这项工作只会产生数小时的挫败感。

我即将离开这个 Breeze/Knockout 项目,或者返回使用 Durandal、Odata 和 Knockout 的项目版本。当我使用 Odata 时,该项目有效。保存结构所需的开销很复杂,但它确实有效。如果无法在整个扩展结构中使用 EntityAspect,则使用 Breeze/Knockout 似乎是一个不可用的选项。

值得注意的是,我使用的是 Visual Studio 2013。VS 2013 的 Intellisense 表明 EntityAspect 功能可用。但是,当我运行该应用程序时,该功能根本不存在。

如果有人能帮我解决这个问题,我将不胜感激,三周的沮丧终于结束了。

不幸的是,Ziad 上次在 2013 年 11 月提出这个问题时没有得到任何答案。希望我能走运。我不敢相信 EntityAspect 的这个问题不会影响 Breeze/Knockout 编程社区中的大量用户。

【问题讨论】:

  • 我们确实检查了 Breeze 版本 1.4.11,即使我们在查询中使用 EXPAND,entityaspect 也能正常工作。现在,我可以确认,在指定 EXPAND 时,版​​本 1.5.0 中的相同查询根本不会返回 enttyAspect。
  • 您是否将 [queryable] 属性添加到您的控制器或 Products 等控制器方法?
  • 嗨,我们确实在 Metadata() 上尝试了 [EnableQuery],并确保元数据正常。现在,当使用查询扩展功能时,我们没有返回任何 entityAspect……再一次,我们在使用 Breeze 1.4.11 时没有遇到问题!您能否提一些建议。提前致谢。

标签: javascript knockout.js entity-framework-6 breeze


【解决方案1】:

Breeze Web API documentation 中所述,您不能在控制器中使用 Web API [EnableQuery][Queryable] 属性。

[EnableQuery]/[Queryable] 属性会更改 Json.net 序列化配置,因此 Breeze 客户端无法识别所包含实体的类型。因此,它将展开节点中的 JSON 数据视为普通旧 JavaScript 对象,而不是具有 entityAspect 属性的实体。

[BreezeQueryable] 属性保留了基本的序列化配置。

[BreezeQueryable] 应用到您的 Web API 控制器查询方法。

【讨论】:

    【解决方案2】:

    问题已通过升级 Breeze 客户端 - Javascript、Breeze 客户端和服务器 - 带有 ASP.NET 和 Entity Framework 6 的 Javascript 客户端、Breeze Server - Entity Framework 6 的 ContextProvider、Breeze Server - ContextProvider 和 Breeze Server - 来解决Web API 2.2 软件包到版本 1.5.1。

    感谢所有参与解决此问题所需的代码更改的人。

    此外,当您升级到 Breeze 版本 1.5.1 时,您需要使用属性 [EnableBreezeQuery],而不是旧版本中使用的属性 [EnableQuery]、[BreezeQueryable] 或 [Queryable] 属性。

    因此,如果您升级到 Breeze 1.5.1 以修复 EXPAND 问题, 将 [EnableBreezeQuery] 应用于您的 Web API 控制器查询方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2013-10-10
      • 1970-01-01
      • 2020-06-08
      相关资源
      最近更新 更多