【问题标题】:Using Delta<T> with complex objects将 Delta<T> 用于复杂对象
【发布时间】:2015-01-22 11:20:21
【问题描述】:

Delta 可以用于复杂的对象图,而不是单个对象吗?我尝试使用它但没有成功,我想知道我是否遗漏了某些东西,或者该功能是否根本不受支持。

例如,这是一个模型:

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) { ... }

那么增量将包含一个 Address 属性,其中 City 和 PostCode 为 null,Street 为“Another Street”。这对我来说似乎是正确的。

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

是我遗漏了什么,还是修补了 Delta 不支持的复杂类型属性?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 根据问题状态,现在好像已经修复了。
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多