我已经嵌套了从服务器返回的json对象,但是当我使用toType(' Customer')时,它并没有填充嵌套对象。在下面的示例中,客户获得了正常,但没有订单和项目。
let meta = {
"structuralTypes": [
{
"shortName": "Customer",
"namespace": "myApp",
"autoGeneratedKeyType": "KeyGenerator",
"defaultResourceName": "Customers",
"dataProperties": [
{
"name": "id",
"dataType": "Guid",
"isNullable": false,
"isPartOfKey": true
},
{
"name": "name",
"dataType": "String",
"maxLength": 200
}
],
"navigationProperties": [
{
"name": "orders",
"entityTypeName": "Order:#myApp",
"isScalar": false,
"associationName": "AN_Customer_Order"
}
]
},
{
"shortName": "Order",
"namespace": "myApp",
"autoGeneratedKeyType": "Identity",
"defaultResourceName": "Orders",
"dataProperties": [
{
"name": "id",
"dataType": "Guid",
"isNullable": false,
"isPartOfKey": true
},
{
"name": "description",
"dataType": "String",
"maxLength": 1000
}
],
"navigationProperties": [
{
"name": "OrderItem",
"entityTypeName": "OrderItems:#dc",
"isScalar": false,
"associationName": "AN_Order_OrderItem"
}
]
},
{
"shortName": "OrderItem",
"namespace": "myApp",
"autoGeneratedKeyType": "Identity",
"defaultResourceName": "OrderItems",
"dataProperties": [
{
"name": "id",
"dataType": "Guid",
"isNullable": false,
"isPartOfKey": true
},
{
"name": "description",
"dataType": "String",
"maxLength": 200
}
]
}
],
"resourceEntityTypeMap": {
"Customers": "Customer:#myApp",
"Orders": "Order:#myApp",
"OrderItems": "OrderItem:#myApp"
}
};
let config = {
dataService: new breeze.DataService({
serviceName: 'http://localhost/api',
hasServerMetadata: false
}),
metadataStore: (new breeze.MetadataStore()).importMetadata(meta)
};
let em = new breeze.EntityManager(config);
let query = breeze.EntityQuery.from('Customer').toType('Customer');
em.executeQuery(query)
.then(data => {
//sucess - do something with data
})
.catch(error => {
//error
});

服务器发送的JSON数据如下所示:
{
id: "5091bed7-e035-45c6-b2c5-d1301e4170e6",
name: "John Doe",
orders: [
{
id: "5091bed7-e035-45c6-b2c5-d1301e419999",
description: "food",
orderItems: [
{
id: "82cbc916-c5af-4117-b759-830fe22e889f",
description: "chocolate"
}
//more orderItems...
]
}
//more orders...
]
}

所以我知道数据是从服务器返回的,当使用toType(' Customer')时,它会填充除订单和orderItem之外的客户对象。我也没有看到任何错误被抛出。如果我删除toType(' Customer'),我可以看到data.results [0]。或者填充。有人可以告诉我为什么订单没有填充?
更新
所以我添加了自定义JsonResultsAdapter,但它仍然无效。当我进行调试时,看起来它正好进入"如果" jsonResultAdapter中的语句,但data.results [0] .orders总是返回空数组,即使服务器返回数据。我可以看到客户是填充和输入的,但不是Order和OrderItems。我做错了什么?
let meta = {
"structuralTypes": [
{
"shortName": "Customer",
"namespace": "myApp",
"autoGeneratedKeyType": "KeyGenerator",
"defaultResourceName": "Customers",
"dataProperties": [
{
"name": "id",
"dataType": "Guid",
"isNullable": false,
"isPartOfKey": true
},
{
"name": "name",
"dataType": "String",
"maxLength": 200
}
],
"navigationProperties": [
{
"name": "orders",
"entityTypeName": "Order:#myApp",
"isScalar": false,
"associationName": "AN_Customer_Order"
}
]
},
{
"shortName": "Order",
"namespace": "myApp",
"autoGeneratedKeyType": "Identity",
"defaultResourceName": "Orders",
"dataProperties": [
{
"name": "id",
"dataType": "Guid",
"isNullable": false,
"isPartOfKey": true
},
{
"name": "description",
"dataType": "String",
"maxLength": 1000
}
],
"navigationProperties": [
{
"name": "OrderItem",
"entityTypeName": "OrderItems:#dc",
"isScalar": false,
"associationName": "AN_Order_OrderItem"
}
]
},
{
"shortName": "OrderItem",
"namespace": "myApp",
"autoGeneratedKeyType": "Identity",
"defaultResourceName": "OrderItems",
"dataProperties": [
{
"name": "id",
"dataType": "Guid",
"isNullable": false,
"isPartOfKey": true
},
{
"name": "description",
"dataType": "String",
"maxLength": 200
}
]
}
],
"resourceEntityTypeMap": {
"Customers": "Customer:#myApp",
"Orders": "Order:#myApp",
"OrderItems": "OrderItem:#myApp"
}
};
let adapter = new breeze.JsonResultsAdapter({
name: "myApp",
extractResults: data => {
var results = data.results;
if (!results) throw new Error("Unable to resolve 'results' property");
return results;
},
visitNode: (node, parseContext, nodeContext) => {
if (node.id && node.orders) {
return { entityType: "Customer" };
}
else if (node.id && node.orderItems) {
return { entityType: "Order" };
}
else{
return { entityType: "OrderItem" };
}
}
});
let config = {
dataService: new breeze.DataService({
serviceName: 'http://localhost/api',
jsonResultsAdapter: adapter,
hasServerMetadata: false
}),
metadataStore: (new breeze.MetadataStore()).importMetadata(meta)
};
let em = new breeze.EntityManager(config);
let query = breeze.EntityQuery.from('Customer'); //removed totType('Customer')
em.executeQuery(query)
.then(data => {
//sucess - do something with data
})
.catch(error => {
//error
});