保存更改时,Breeze不会反序列化实体更改集

时间:2013-04-11 20:29:30

标签: breeze

我在针对标准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设置为空实体对象。在反序列化期间没有出现错误,因此我无法说明为什么会发生这种情况。

有人能指出我可能解决的问题吗?

谢谢, 理查德

1 个答案:

答案 0 :(得分:3)

好的,我想出来了,这对我来说是一个愚蠢的错误。我在服务器上的实体类型已使用public decimal QtyReceived { get; **internal** set; }等内部设置器声明。这意味着JSON反序列化器无法设置属性值。有趣的是,这个错误只是被deserilizer忽略了。

将此setter更改为公开修复此问题。