我现在使用的是Breeze 1.1.14,以前我使用的是Breeze 1.1.11。当我使用Breeze 1.1.11时,我可以使用扩展实体和带有.expand
子句的查询,并且我的结果集将包含扩展实体。对于Breeze 1.1.14,情况不再是这样了。如果我使用.expand
子句,我将只返回实体的非扩展部分。
下面是一个例子:首先声明扩展的实体:
var projectAugmented = function() {
this.LastFirstName = ko.observable("");
this.ProjectNameTemp = ko.observable("");
this.flushYesNo = ko.observable(false);
};
metadataStore.registerEntityTypeCtor("tblProjects", projectAugmented);
然后创建一个使用扩展实体的函数:
var getProject = function(projectName) {
var deferred = Q.defer();
var predicate = new breeze.Predicate("ProjectName", "==", projectName);
var qry = new breeze.EntityQuery()
.from("GetProject")
.where(predicate)
.expand("tblProjects_Techs, tblProjects_GSIDs, tblProjects_Customers, tblLogBook");
manager.executeQuery(qry.using())
.then(function(r) {
deferred.resolve(r.results);
})
.fail(qryFailed);
function qryFailed(e) {
deferred.reject(new Error(e));
}
return deferred.promise;
};
如果我使用Breeze 1.4.14运行查询,查询将不会返回任何扩展的Entity值。如果删除.expand子句,查询将返回扩展的Entity值。这个功能在Breeze 1.4.11中就存在了。这是一个bug,还是Breeze 1.4.14中的一个新特性?如果它是一个新特性,那么它的文档在哪里?
我们没有故意改变您期望的行为。我不喜欢赘言,但在很多情况下,应用程序代码的更改是由于意外事故,而不是更改到Breeze版本。
所以请迁就我,并绝对肯定地证实你的要求。我的意思是,您取完全相同的代码,并显示单独将v.1.4.14交换为1.4.11会导致问题。
顺便说一下,你可以通过省略可观察对象来简化你的自定义构造函数。简单的属性定义就可以了。
var projectAugmented = function() {
this.LastFirstName = "";
this.ProjectNameTemp = "";
this.flushYesNo = false;
};
如果你能确认1.4.14有问题,我很好奇简化的构造函数是否有区别。
杂费
你不需要做你自己的承诺工作与deferred
。您正在使用的微风查询方法已经返回承诺。
var getProject = function(projectName) {
return new breeze.EntityQuery()
.from("GetProject")
.where("ProjectName", "==", projectName)
.expand("tblProjects_Techs, tblProjects_GSIDs, tblProjects_Customers, tblLogBook")
.using(manager).execute()
.then(function(data) {return data.results;});
// no need for your fail clause because it's work is already in a failed promise from breeze
};
看,没有多余的承诺饮料,那是多么清爽?
我找到了这个问题的答案。当我查看连接到我的应用程序的packages文件夹时,我看到我有版本1.4.12和版本1.4.14的Breeze模块。我发现这很有趣,因为在我尝试升级到Breeze 1.4.14之前,应用程序的原始版本包含Breeze 1.4.11和Breeze 1.4.12模块。
解决方案是从packages文件夹中删除所有的"Breeze"模块。然后,我在Visual Studio 2013环境中运行了Clean Solution。然后,我使用NuGet包管理器重新加载了"Breeze"模块。在我加载了Breeze 1.4.14模块之后,包折叠只包含Breeze 1.4.14模块。
在加载了1.4.14版本的Breeze模块之后,我仍然有大量的工作要做,因为1.4.11版本的Breeze的语法与1.4.14版本的Breeze不同。
我必须在BreezeController.cs中用[EnableQuery]替换[Queryable]的所有实例。我还必须将IQueryable<>的所有实例替换为IEnumerable<>。完成这些更改后,重新构建应用程序,应用程序可以正常工作。