这是 Ziad 于 2013 年 11 月 13 日提出的问题的后续。他的问题是关于在 BreezeJS 中添加扩展子句后 EntityAspect 属性不再可用。看起来这个功能在 V1.4.3 中有效,但在使用 EF6 和 WebApi2 升级到 V1.4.5 后,此功能不再可用。我们现在有V1.5、EF 6.1.1和WebApi 2.2的Breeze Client,功能还没有恢复。我的问题是:此功能是否会恢复,如果不会,是否有可用的解决方法。除非我能找到解决这个问题的方法,否则我有一个主要的基于 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 类型的可观察对象。
我能够解决检索字段显示为纯文本的问题。我相信这是因为我使用了 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 Web API documentation 中所述,您不能在 Controller 中使用 Web API [EnableQuery]
或 [Queryable]
属性。
[EnableQuery]
/[Queryable]
属性更改 Json.net 序列化配置,这样 Breeze 客户端就无法识别包含的实体的类型。因此,它将扩展节点中的 JSON 数据视为普通旧 JavaScript 对象,而不是具有 entityAspect
属性的实体。
[BreezeQueryable]
属性保留了基本的序列化配置。
将 [BreezeQueryable]
应用于您的 Web API Controller 查询方法。
关于javascript - 将扩展子句添加到 BreezeJS 查询后,EntityAspect 属性仍然无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26393143/