Breeze在保存更改时未反序列化实体更改集

Breeze在保存更改时未反序列化实体更改集,breeze,Breeze,我正在对标准RPC样式的WebAPI使用Breeze。我已经用[BreezeController]属性装饰了控制器。我已经在客户机上为WebAPI操作返回的实体定义了实体元数据。我的Breeze数据服务设置如下: var dataService = new breeze.DataService({ serviceName: "http://localhost/api/PartReceiptPurchaseOrders", hasServerMetadata: false });

我正在对标准RPC样式的WebAPI使用Breeze。我已经用
[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已修复此问题。

感谢您发回。如果我想重编一遍,这本书可能会让我丧命:)谢谢你回复。这一次,如果我想重做它,我会死的:)