Entity framework Breeze扩展实体属性仅在第二次查询时加载

Entity framework Breeze扩展实体属性仅在第二次查询时加载,entity-framework,angularjs,breeze,Entity Framework,Angularjs,Breeze,希望有人能更好地了解Breeze的扩展实体,因为我被难住了!因此,我在服务器端(使用Breeze的API的Web API)创建了一个分部类(WO_Rout),并创建了一个名为“AssetJobEqNo”的属性 我已经阅读并遵循Breeze的文档,但没有结果。按照指南,我为这个特殊实体“WO_Rout”创建了一个构造函数,如下所示: 当我查询我的控制器时,这个特定属性“AssetJobEqNo”被发送并在客户端的JSON原始结果中看到 所以…这是我无法理解的奇怪部分。如果我在UI上运行一个绑定到按

希望有人能更好地了解Breeze的扩展实体,因为我被难住了!因此,我在服务器端(使用Breeze的API的Web API)创建了一个分部类(WO_Rout),并创建了一个名为“AssetJobEqNo”的属性

我已经阅读并遵循Breeze的文档,但没有结果。按照指南,我为这个特殊实体“WO_Rout”创建了一个构造函数,如下所示:

当我查询我的控制器时,这个特定属性“AssetJobEqNo”被发送并在客户端的JSON原始结果中看到

所以…这是我无法理解的奇怪部分。如果我在UI上运行一个绑定到按钮的查询,该属性将被加载,并且在我分配给它的对象中,但它仍然是空字符串的默认值,它永远不会加载。然后我再次运行完全相同的查询,获取相同的实体,这一次值就在那里

总之,我不明白为什么这个扩展实体的属性在第一次查询时没有被填充,但是如果我运行第二次加载的完全相同的查询,它会被填充吗

希望这一切都有意义

数据服务功能:

function getWorkOrder(reqNo) {
    if (reqNo > 0) {
        var query = breeze.EntityQuery.from("GetWorkOrders");
        query = query.where("req_no", "==", reqNo)
            .expand(["WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.persmast", "WO_RtHelp.WO_Act.WO_Resources.Kits", "WO_RtHelp.WO_Act.Activity", "WO_RtHelp.WO_Act.WO_Resources.customer", "WO_RtHelp.WO_Act.WO_Resources.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.invsite.invmast", "WO_RtHelp.WO_Act.WO_Resources.crew"])
        return manager.executeQuery(query);
    } else {
        return throwNotification('Please enter a Work Order number.');
    }
}
 proto.initializeFrom = function (rawEntity) {
        // HACK:
        // copy unmapped properties from newly created client entity to the rawEntity.
        // This is so that we don't lose them when we update from the rawEntity to the target.
        // Something that will occur immediately after this method completes. 
        var that = this;
        this.entityType.unmappedProperties.forEach(function(prop) {
            var propName = prop.name;
            that[propName] = rawEntity[propName];  // CassidyK 
            //rawEntity[propName] = that[propName]; // Breeze 
        });

        if (!this._backingStore) {
            this._backingStore = { };
        }
    };
用于成功查询的控制器功能

function querySucceeded(data) {

    $scope.WorkOrder = {};

    if (data.results.length === 0) {
        sysErrorNotification('No Work Order with System #' + $scope.workOrderSearchNumber);
    }
    else {
        $scope.WorkOrder = data.results[0];
        $scope.myData = $scope.WorkOrder.WO_RtHelp;
        $('#bottomNav a[href="/WorkOrders/#woMain"]').tab('show');
        resetDataSources();
        $scope.$apply();
    }
}

我使用的是Breeze、Angular、Q和jQuery

查看沃德在以下问题中的答案-它应该可以为您提供有关未映射属性的指导

老实说,我根本看不出它是如何工作的,除非我错过了一些你已经屠杀了expand()的东西

应为字符串,其中的值分隔为-

 query = query.where("req_no", "==", reqNo)
        .expand("WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast, WO_RtHelp.WO_Act.WO_Resources.persmast, WO_RtHelp.WO_Act.WO_Resources.Kits, WO_RtHelp.WO_Act.Activity, WO_RtHelp.WO_Act.WO_Resources.customer, WO_RtHelp.WO_Act.WO_Resources.eqptmast, WO_RtHelp.WO_Act.WO_Resources.invsite.invmast, WO_RtHelp.WO_Act.WO_Resources.crew")

请注意,我没有传递字符串数组,而是传递了一个用逗号分隔值的字符串。

查看Ward在下面问题中的答案-它应该为您提供有关未映射属性的指导

老实说,我根本看不出它是如何工作的,除非我错过了一些你已经屠杀了expand()的东西

应为字符串,其中的值分隔为-

 query = query.where("req_no", "==", reqNo)
        .expand("WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast, WO_RtHelp.WO_Act.WO_Resources.persmast, WO_RtHelp.WO_Act.WO_Resources.Kits, WO_RtHelp.WO_Act.Activity, WO_RtHelp.WO_Act.WO_Resources.customer, WO_RtHelp.WO_Act.WO_Resources.eqptmast, WO_RtHelp.WO_Act.WO_Resources.invsite.invmast, WO_RtHelp.WO_Act.WO_Resources.crew")

请注意,我没有传递字符串数组,而是传递了一个用逗号分隔值的字符串。

因此,经过几天的反复努力,我相信我已经解决了这个问题。在实体的创建和合并过程中跟踪实体之后,当从查询中具体化时,我发现我的属性被“rawEntity”覆盖,它具有扩展实体属性“”的默认值

我正在使用Breeze 1.4.2并使用Breeze.debug.js进行调试,在第14854行发现函数proto.initializeFrom导致了这个问题

以下是我为解决此问题所做的操作:

function getWorkOrder(reqNo) {
    if (reqNo > 0) {
        var query = breeze.EntityQuery.from("GetWorkOrders");
        query = query.where("req_no", "==", reqNo)
            .expand(["WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.persmast", "WO_RtHelp.WO_Act.WO_Resources.Kits", "WO_RtHelp.WO_Act.Activity", "WO_RtHelp.WO_Act.WO_Resources.customer", "WO_RtHelp.WO_Act.WO_Resources.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.invsite.invmast", "WO_RtHelp.WO_Act.WO_Resources.crew"])
        return manager.executeQuery(query);
    } else {
        return throwNotification('Please enter a Work Order number.');
    }
}
 proto.initializeFrom = function (rawEntity) {
        // HACK:
        // copy unmapped properties from newly created client entity to the rawEntity.
        // This is so that we don't lose them when we update from the rawEntity to the target.
        // Something that will occur immediately after this method completes. 
        var that = this;
        this.entityType.unmappedProperties.forEach(function(prop) {
            var propName = prop.name;
            that[propName] = rawEntity[propName];  // CassidyK 
            //rawEntity[propName] = that[propName]; // Breeze 
        });

        if (!this._backingStore) {
            this._backingStore = { };
        }
    };

如果我发现我在这里实施的修复有任何问题,我会不断更新此信息。

因此经过几天的努力,我相信我已经解决了问题。在实体的创建和合并过程中跟踪实体之后,当从查询中具体化时,我发现我的属性被“rawEntity”覆盖,它具有扩展实体属性“”的默认值

我正在使用Breeze 1.4.2并使用Breeze.debug.js进行调试,在第14854行发现函数proto.initializeFrom导致了这个问题

以下是我为解决此问题所做的操作:

function getWorkOrder(reqNo) {
    if (reqNo > 0) {
        var query = breeze.EntityQuery.from("GetWorkOrders");
        query = query.where("req_no", "==", reqNo)
            .expand(["WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.persmast", "WO_RtHelp.WO_Act.WO_Resources.Kits", "WO_RtHelp.WO_Act.Activity", "WO_RtHelp.WO_Act.WO_Resources.customer", "WO_RtHelp.WO_Act.WO_Resources.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.invsite.invmast", "WO_RtHelp.WO_Act.WO_Resources.crew"])
        return manager.executeQuery(query);
    } else {
        return throwNotification('Please enter a Work Order number.');
    }
}
 proto.initializeFrom = function (rawEntity) {
        // HACK:
        // copy unmapped properties from newly created client entity to the rawEntity.
        // This is so that we don't lose them when we update from the rawEntity to the target.
        // Something that will occur immediately after this method completes. 
        var that = this;
        this.entityType.unmappedProperties.forEach(function(prop) {
            var propName = prop.name;
            that[propName] = rawEntity[propName];  // CassidyK 
            //rawEntity[propName] = that[propName]; // Breeze 
        });

        if (!this._backingStore) {
            this._backingStore = { };
        }
    };

如果我发现我在这里实施的修复有任何问题,我会更新此信息。

我没有使用breeze,因此这可能是一个无知的问题,但是QuerySucceed是如何调用的?你有手表什么的吗?您说过您可以看到请求发生并且数据得到更新,但是什么触发了作用域apply(或者您的函数具有apply to fire)?从控制台上看,这能让它工作吗?angular.element($(“[ng app]”).scope().$apply();它是基于数据服务中的函数调用的。在调用数据服务的函数中,有一个.then(querysucceed)和.fail(queryFailed)来路由查询结果。不,这不起作用,因为我已经在angular中从作用域调用了apply方法。下面是调用查询的地方:$scope.getAllWorkOrders=function(){workOrderDataservice.getWorkOrder($scope.workOrderArchNumber)。然后(querySucceed)。fail(queryFailed);};我没有和微风一起工作过,所以这可能是一个无知的问题,但QuerySucceed是如何被称为的?你有手表什么的吗?您说过您可以看到请求发生并且数据得到更新,但是什么触发了作用域apply(或者您的函数具有apply to fire)?从控制台上看,这能让它工作吗?angular.element($(“[ng app]”).scope().$apply();它是基于数据服务中的函数调用的。在调用数据服务的函数中,有一个.then(querysucceed)和.fail(queryFailed)来路由查询结果。不,这不起作用,因为我已经在angular中从作用域调用了apply方法。下面是调用查询的地方:$scope.getAllWorkOrders=function(){workOrderDataservice.getWorkOrder($scope.workOrderArchNumber)。然后(querySucceed)。fail(queryFailed);};我删除了括号,仍然没有什么区别,因为这处理了扩展,这不是一个问题。关于你链接的StackOverflow帖子,我已经读了十几遍了。这篇文章没有回答这个问题,而是Ward说“我需要一个重做!”根据Breeze文档,实体物化的流程是这样的:当Breeze通过查询或实体导入物化一个对象时,顺序是1。建造师2。初始化函数3。合并到缓存考虑到这个流,变量设置为“”,但是合并数据时应该填充。更新:我实际上切换回了括号,因为我正确地使用了括号。具有多个要展开的关系或导航属性,是一个数组,需要这样做。这里的参考:这个问题是从一月开始的,请参考官方的API d