【问题标题】:Breeze is not deserializing entity change sets when saving changes保存更改时,Breeze 不会反序列化实体更改集
【发布时间】:2013-04-13 03:38:43
【问题描述】:

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

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

修改实体后调用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 属性包含一个空对象,如下所示:

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(new JTokenReader(jo), entityType) 的调用将entityInfo.Entity 设置为一个空实体对象。在反序列化过程中没有出现错误,所以我不知道为什么会这样。

谁能指出一个可能的解决方案?

谢谢, 理查德

【问题讨论】:

    标签: breeze


    【解决方案1】:

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

    将设置器更改为公开可修复此问题。

    【讨论】:

    • 感谢您的回帖。这个会杀了我试图复制它:)
    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多