Breeze在保存更改时未反序列化实体更改集
我正在对标准RPC样式的WebAPI使用Breeze。我已经用Breeze在保存更改时未反序列化实体更改集,breeze,Breeze,我正在对标准RPC样式的WebAPI使用Breeze。我已经用[BreezeController]属性装饰了控制器。我已经在客户机上为WebAPI操作返回的实体定义了实体元数据。我的Breeze数据服务设置如下: var dataService = new breeze.DataService({ serviceName: "http://localhost/api/PartReceiptPurchaseOrders", hasServerMetadata: false });
[BreezeController]
属性装饰了控制器。我已经在客户机上为WebAPI操作返回的实体定义了实体元数据。我的Breeze数据服务设置如下:
var dataService = new breeze.DataService({
serviceName: "http://localhost/api/PartReceiptPurchaseOrders",
hasServerMetadata: false
});
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
修改实体后调用EntityManager的SaveChanges
方法时,服务器上的EntityInfo
对象为空。传递给SaveChanges方法的序列化实体似乎未正确反序列化到服务器上的预期实体中。我很难理解我做错了什么
当我检查传递给WebAPI控制器上的SaveChanges
方法的JObject saveBundle
参数时,我得到了预期的实体详细信息:
{
"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
属性包含一个空对象,如下所示:
var dataService = new breeze.DataService({
serviceName: "http://localhost/api/PartReceiptPurchaseOrders",
hasServerMetadata: false
});
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
如果我在Breeze.WebApi.ContextProvider
类中的CreateEntityInfoFromJson
中设置断点,我会看到对jsonSerializer.Deserialize(新的JTokenReader(jo),entityType)
的调用将entityInfo.Entity
设置为空实体对象。在反序列化过程中没有出现错误,因此我无法说明发生这种情况的原因
有人能告诉我一个可能的解决办法吗
谢谢,
理查德好吧,我发现了这一点,我犯了一个愚蠢的错误。我在服务器上的实体类型已使用内部设置程序声明,如
public decimal QtyReceived{get;**internal**set;}
。这意味着JSON反序列化程序无法设置属性值。有趣的是,反序列化程序只是忽略了错误
将setter更改为public解决了这个问题。好的,我发现这是一个愚蠢的错误。我在服务器上的实体类型已使用内部设置程序声明,如
public decimal QtyReceived{get;**internal**set;}
。这意味着JSON反序列化程序无法设置属性值。有趣的是,反序列化程序只是忽略了错误
将setter更改为public已修复此问题。感谢您发回。如果我想重编一遍,这本书可能会让我丧命:)谢谢你回复。这一次,如果我想重做它,我会死的:)