将Delta <t>与复杂对象一起使用</t>

时间:2015-01-15 12:09:30

标签: asp.net-web-api asp.net-web-api-odata

Delta&lt; T&gt;用于复杂的对象图,而不是单个对象?我试过没有成功使用它,我想知道我是否遗漏了某些东西,或者是否功能不受支持。

例如,这是一个模型:

public class Person {
  public int Id { get;set; }
  public string Name { get;s set; }
  public Address Address { get; set; }
}

public class Address {
  public string Street { get; set; }
  public string City { get; set; }
  public string PostCode { get; set; }
}

以下是OData模型构建:

var builder = new ODataConventionModelBuilder();
builder.ComplexType<Address>();
builder.EntitySet<Person>("Person");

对于我的控制器的POST方法,我可以使用这个JSON,它将被反序列化:

{
  "Name": "Mr Smith",
  "Address": {
    "Street": "Some Street",
    "City": "Some City",
    "PostCode": "Some PostCode"
  }
}

但是,当我使用PATCH时会出现问题。如果我寄这个:

{ 
  "Name": "Mr Doe",
  "Address": {
    "Street": "Another Street"
  }
}

我的控制器方法签名如下所示:

public IHttpActionResult Patch([FromODataUri] key, Delta<Person> delta) { ... }

然后delta将包含一个Address属性,对于City和PostCode为&null;&#34; Another Street&#34;为街。这似乎对我来说是正确的。

当我然后使用delta.Patch(person)将更改应用于person对象时,它会将此地址批量复制到此人,而不仅仅是更新地址的Street属性。

我是否遗漏了某些内容,或修补了Delta&lt; T&gt;不支持的复杂类型属性?

1 个答案:

答案 0 :(得分:2)

这是目前的行为。复杂类型属性是OData中的结构属性之一,在更新实体时会被视为一个单元。

但是,Web API存在问题(Support PATCH to a complex type)来跟踪此问题。