不会在微风中填充嵌套对象

时间:2015-10-29 18:21:28

标签: javascript json metadata breeze

我已经嵌套了从服务器返回的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
    	});




0 个答案:

没有答案