Entity framework Breeze扩展实体属性仅在第二次查询时加载
希望有人能更好地了解Breeze的扩展实体,因为我被难住了!因此,我在服务器端(使用Breeze的API的Web API)创建了一个分部类(WO_Rout),并创建了一个名为“AssetJobEqNo”的属性 我已经阅读并遵循Breeze的文档,但没有结果。按照指南,我为这个特殊实体“WO_Rout”创建了一个构造函数,如下所示: 当我查询我的控制器时,这个特定属性“AssetJobEqNo”被发送并在客户端的JSON原始结果中看到 所以…这是我无法理解的奇怪部分。如果我在UI上运行一个绑定到按钮的查询,该属性将被加载,并且在我分配给它的对象中,但它仍然是空字符串的默认值,它永远不会加载。然后我再次运行完全相同的查询,获取相同的实体,这一次值就在那里 总之,我不明白为什么这个扩展实体的属性在第一次查询时没有被填充,但是如果我运行第二次加载的完全相同的查询,它会被填充吗 希望这一切都有意义 数据服务功能: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上运行一个绑定到按
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