0

我正在针对标准 RPC 样式的 WebAPI 使用 Breeze。我用[BreezeController]属性装饰了控制器。我已经在客户端为 WebAPI 操作返回的实体定义了实体元数据。我的微风数据服务设置如下:

var dataService = new breeze.DataService({
    serviceName: "http://localhost/api/PartReceiptPurchaseOrders",
    hasServerMetadata: false
});

SaveChanges修改实体后调用EntityManager的方法时,EntityInfo服务端的对象为空。似乎传递给 SaveChanges 方法的序列化实体未正确反序列化为服务器上的预期实体。我很难理解我做错了什么。

当我检查JObject saveBundle传递给SaveChangesWebAPI 控制器上的方法的参数时,我得到了预期的实体详细信息:

{  
    "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为一个空实体对象。在反序列化过程中没有出现错误,所以我不知道为什么会这样。

谁能指出我可能的解决方案?

谢谢,理查德

4

1 回答 1

3

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

将设置器更改为公开解决了此问题。

于 2013-04-11T21:06:35.207 回答