Javascript 阅读BreezeJS中的odata链接

Javascript 阅读BreezeJS中的odata链接,javascript,odata,breeze,sap-gateway,Javascript,Odata,Breeze,Sap Gateway,我正在尝试让BreezeJS库使用SAP OData服务。 这对读取实体有效,但我无法解析链接对象 我的EntityType是一个OrgObject 我有一个链接来解析所有链接对象(链接名为Children) 因此,此breeze查询正在运行: var query=new breeze.EntityQuery().from(“OrgObjects”); manager.executeQuery.then(函数(数据){ data.results.forEach(函数(项){ 控制台日志(

我正在尝试让BreezeJS库使用SAP OData服务。 这对读取实体有效,但我无法解析链接对象

我的EntityType是一个OrgObject


我有一个链接来解析所有链接对象(链接名为Children)


因此,此breeze查询正在运行:

var query=new breeze.EntityQuery().from(“OrgObjects”);
manager.executeQuery.then(函数(数据){
data.results.forEach(函数(项){
控制台日志(项目);
});
})。失败(/*…*/);
我如何从这个对象中调用“子对象”

尝试1:

var query=new breeze.EntityQuery().from(“OrgObjects”);
manager.executeQuery.then(函数(数据){
data.results.forEach(函数(项){
控制台日志(项目);
// ...
var Children=item.Children();
// ...
});
})。失败(/*…*/);
这将导致一个错误:

message: "Object [object Object] has no method 'children'"
尝试2:

var query=new breeze.EntityQuery().from(“OrgObjects”);
manager.executeQuery.then(函数(数据){
data.results.forEach(函数(项){
控制台日志(项目);
// ...
item.entityAspect.loadNavigationProperty(“子项”)。然后(函数(数据){
console.log(data.results);
data.results.forEach(函数(项){
控制台日志(项目);
});
}).失败(功能(e){
控制台日志(e);
});
// ...
});
})。失败(/*…*/);
这将导致一个错误:

message: "Object [object Object] has no method 'children'"
“propertyOrExpr”参数必须是“字符串”

尝试3:

var query=new breeze.EntityQuery().from(“OrgObjects”).expand(“Children”);
manager.executeQuery.then(函数(数据){
data.results.forEach(函数(项){
控制台日志(项目);
// ...
console.log(item.Children);
console.log(item.Children.length);
// ...
});
})。失败(/*…*/);
结果:
项。子项是一个对象。但是
item.Children.length=0
。 当我检查http响应时,会从服务器获取子项,但在
项.children
对象中不可用

控制台输出:

财务部
[parentEntity:Object,navigationProperty:ctor,arrayChanged:ctor,_addsInProcess:Array[0],push:function…]
_addsInProcess:数组[0]
_getEventParent:函数(){
_getPendingPubs:函数(){
阵列更改:ctor
长度:0
加载:函数(回调,errorCallback){
导航属性:ctor
父实体:对象
pop:函数(){
推送:函数(){
移位:函数(){
拼接:函数(){
取消移位:函数(){
__原型:数组[0]
0

谁能帮我?我的OData服务中缺少什么吗?

免责声明:我对Breeze不太熟悉,但我对可能发生的事情有一个猜测

在Breeze中,它说它不会延迟加载导航属性
数据在本地还不是完全可用的,它不会出去获取数据。您需要明确请求将子数据与负载的其余部分内联检索,以便在本地获取此信息。通常在OData中,这是通过请求URL中的
$expand
查询参数完成的。在(根据我链接到的文档),它是通过
.expand()
方法完成的,如下所示:

var query = new breeze.EntityQuery()
              .from("OrgObjects")
              .expand("Children");
问题已经“解决”

breeze中的1->n关系只能在定义了反向属性(n->1)的情况下使用。据我所知,在SAP Gateway中无法定义反向关系。为了测试它,我创建了2个关系:

<Association Name="OrgObject_To_Children" sap:content-version="1">
    <End Type="ZGW_ORGSTRUCTURE.OrgObject" Multiplicity="1" Role="FromRole_OrgObject_To_Children"/>
    <End Type="ZGW_ORGSTRUCTURE.OrgObject" Multiplicity="*" Role="ToRole_OrgObject_To_Children"/>
</Association>
<Association Name="OrgObject_To_Children_inverse" sap:content-version="1">
    <End Type="ZGW_ORGSTRUCTURE.OrgObject" Multiplicity="*" Role="FromRole_OrgObject_To_Children_inverse"/>
    <End Type="ZGW_ORGSTRUCTURE.OrgObject" Multiplicity="1" Role="ToRole_OrgObject_To_Children_inverse"/>
</Association>
但这并不能解决所有问题,还有一件事我必须改变才能让它工作。 不知道这是一个bug还是与SAP网关有关

function mergeRelatedEntitiesCore(rawEntity, navigationProperty, parseContext) {
    var relatedRawEntities = rawEntity[navigationProperty.nameOnServer];
    if (!relatedRawEntities) return null;

    // needed if what is returned is not an array and we expect one - this happens with __deferred in OData.
    /* original code 
    if (!Array.isArray(relatedRawEntities)) return null;

    var relatedEntities = relatedRawEntities.map(function(relatedRawEntity) {
        return visitAndMerge(relatedRawEntity, parseContext, { nodeType: "navPropItem", navigationProperty: navigationProperty });
    });

    return relatedEntities;
    end original code */

    if (!Array.isArray(relatedRawEntities.results)) 
        return null;

    relatedRawEntities.results = relatedRawEntities.results.map(function(relatedRawEntity) {
        return visitAndMerge(relatedRawEntity, parseContext, { nodeType: "navPropItem", navigationProperty: navigationProperty });
    });

    return relatedRawEntities.results;

}
我只测试了读取操作。稍后我将检查更新操作

韩国,
Joachim

@Jowa-感谢您为SAP和BreezeJS的合作所做的努力

您发现了
expand
,这是一种急切地加载父对象
OrgObject
的子对象的方法

当导航属性正常工作时,您可以通过
loadNavigationProperty
…按需加载它们…尽管对每个查询结果逐个加载会非常低效。这种情况需要
展开

很明显,Breeze正在努力处理导航属性,因为它无法识别支持关系的子实体中的外键

您不必为1..m关系的两侧定义导航属性。最常忽略的一侧是1->N侧(父->子)属性。例如,我们大多数人都会忽略
Gender.Person
,因为我们不想要集合
male.Persons

在你的情况下,如果我理解正确,你认为1->N(
OrgObject.Children
)是定义的,而不是N->1导航(
Child.OrgObject
)。这也应该行得通!

但无论如何,为了使导航属性在任一方向上工作,元数据必须标识子实体类型中的外键(FK)属性

出于某种原因,Breeze似乎没有得到这些信息

黑客BreezeJS本身…虽然很聪明…应该没有必要

我们愿意提供帮助。我们需要以下信息:

  • Child
    服务器上的类定义…突出显示其
    OrgObject
    FK属性
  • 元数据存储
    对象中与
    组织对象
    子对象
    相关的元数据
  • 元数据文件中的
    OrgObject
    -和
    Child
    -相关JSON通过网络传输

感谢您的回答,我会尝试一下。当我检查此查询的答复时,所有的回答都是错误的