Использование 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 для сложного типа) для отслеживания этой проблемы.