这是Ziad在2013年11月13日提出的问题的后续跟进。他的问题是在BreezeJS中添加扩展条款后,EntityAspect属性不再可用。似乎此功能在V1.4.3中有效,但在使用EF6和WebApi2升级到V1.4.5后,此功能不再可用。我们现在有一个V1.5的Breeze客户端,EF 6.1.1和WebApi 2.2,功能仍然没有恢复。我的问题是:是否可以恢复此功能,如果没有,是否有可用的解决方法。除非我能找到克服这个问题的方法,否则我有一个主要的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类型的observable。
我能够解决检索到的字段显示为纯文本的问题。我相信这是因为我使用了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编程社区中的大量用户。
答案 0 :(得分:2)
正如Breeze Web API documentation中所述,您无法在控制器中使用Web API [EnableQuery]
或[Queryable]
属性。
[EnableQuery]
/ [Queryable]
属性会更改Json.net序列化配置,以便Breeze客户端无法识别所包含实体的类型。因此,它将扩展节点中的JSON数据视为普通旧JavaScript对象,而不是具有entityAspect
属性的实体。
[BreezeQueryable]
属性保留了基本的序列化配置。
将[BreezeQueryable]
应用于您的Web API控制器查询方法。
答案 1 :(得分:1)
通过升级Breeze客户端 - Javascript,Breeze客户端和服务器 - 使用ASP.NET和Entity Framework 6的Javascript客户端,Breeze Server - 实体框架6的ContextProvider,Breeze Server - ContextProvider和Breeze Server - 来解决问题Web API 2.2软件包到1.5.1版。
感谢所有致力于解决此问题所需的代码更改的人。
此外,当您升级到Breeze版本1.5.1时,您需要使用属性[EnableBreezeQuery],而不是旧版本中使用的attrbutes [EnableQuery],[BreezeQueryable]或[Queryable]属性。 / p>
因此,如果您升级到Breeze 1.5.1以修复EXPAND问题, 将[EnableBreezeQuery]应用于Web API控制器查询方法。