在Breeze 1.4.14中,不能使用带有.expand子句的查询返回扩展实体



我现在使用的是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<>。完成这些更改后,重新构建应用程序,应用程序可以正常工作。

最新更新