Использование Delta‹T› со сложными объектами

Можно ли использовать Delta‹T› со сложными графами объектов, а не с отдельными объектами? Я безуспешно пытался использовать его, и мне интересно, я что-то упустил или функциональность просто не поддерживается.

Например, вот модель:

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 с нулевым значением для города и почтового индекса и «Другая улица» для улицы. Это кажется мне правильным.

Когда я затем использую delta.Patch(person) для применения изменений к объекту человека, он полностью копирует этот адрес человеку, а не просто обновляет свойство Street адреса.

Я что-то упустил, или Delta‹T› не поддерживает исправление свойств сложного типа?


person Mark Watts    schedule 15.01.2015    source источник


Ответы (1)


Это текущее поведение. Свойство сложного типа, одно из структурных свойств в OData, рассматривается как единица при обновлении объекта.

Однако в веб-API есть проблема (Поддержка PATCH для сложного типа) для отслеживания этой проблемы. .

person Sam Xu    schedule 22.01.2015
comment
Судя по статусу проблемы, сейчас она исправлена. - person HappyNomad; 31.05.2016