我在针对标准RPC样式的WebAPI使用Breeze。我用[BreezeController]
属性修饰了控制器。我已在客户端上为WebAPI操作返回的实体定义了实体元数据。我的Breeze DataService设置如下:
var dataService = new breeze.DataService({
serviceName: "http://localhost/api/PartReceiptPurchaseOrders",
hasServerMetadata: false
});
在修改实体后调用EntityManager的SaveChanges
方法时,服务器上的EntityInfo
对象为空。看来传递给SaveChanges方法的序列化实体没有被正确地反序列化到服务器上的预期实体中。我很难理解我做错了什么。
当我检查传递给WebAPI控制器上的JObject saveBundle
方法的SaveChanges
参数时,我得到了预期的实体细节:
{
"entities": [{
"PurchaseOrderPartId": 1,
"PartNumber": "ABC",
"SupplierPartNumber": "12345",
"Description": "Some Part",
"Bin": "1",
"Qty": 24,
"QtyReceived": 24,
"QtyBackordered": 0,
"Cost": 60,
"Currency": "USD",
"PurchaseOrderId":1,
"entityAspect": {
"entityTypeName": "PurchaseOrderPart:#MyApp.Models",
"entityState": "Modified",
"originalValuesMap": {
"QtyReceived": 0
},
"autoGeneratedKey":{
"propertyName": "PurchaseOrderPartId",
"autoGeneratedKeyType": "Identity"
}
}
}],
"saveOptions": { "allowConcurrentSaves": false }
}
但是,在调用基类方法Breeze.WebApi.ContextProvider.SaveChanges()
之后,entityInfo.Entity
属性包含一个空对象,如下所示:
entityInfo {Breeze.WebApi.EntityInfo}
AutoGeneratedKey: null {Breeze.WebApi.AutoGeneratedKey}
Entity {MyApp.Models.PurchaseOrderPart}
Bin: null
Cost: 0
Currency: null
Description: null
PartNumber: null
PurchaseOrder: null {MyApp.Models.PurchaseOrder}
PurchaseOrderId: 0
PurchaseOrderPartId: 0
Qty: 0
QtyBackordered: 0
QtyReceived: 0
SupplierPartNumber: null
如果我断开了CreateEntityInfoFromJson
类中的Breeze.WebApi.ContextProvider
,我看到对jsonSerializer.Deserialize(new JTokenReader(jo), entityType)
的调用将entityInfo.Entity
设置为空实体对象。在反序列化期间没有出现错误,因此我无法说明为什么会发生这种情况。
有人能指出我可能解决的问题吗?
谢谢, 理查德
答案 0 :(得分:3)
好的,我想出来了,这对我来说是一个愚蠢的错误。我在服务器上的实体类型已使用public decimal QtyReceived { get; **internal** set; }
等内部设置器声明。这意味着JSON反序列化器无法设置属性值。有趣的是,这个错误只是被deserilizer忽略了。
将此setter更改为公开修复此问题。