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

Может ли 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 и "Another Street" для Street. Мне кажется, это правильно.

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

Я что-то упустил или исправления свойств сложного типа не поддерживаются Delta?

1 ответ

Решение

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

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

Другие вопросы по тегам