Вот сценарий. Существует сетевой запрос api для изменения объекта в базе данных sql-сервера. Мы хотим только изменить поля в объекте базы данных, если они были явно указаны в webapi call json. Например:
{ "Name":"newName", "Colour":null }
Это должно изменить поле "Имя" в поле "newName" и "Color" равным null. В отличие от этого json:
{ "Name":"newName" }
который должен изменить только поле Name, оставив прежнее значение цвета.
Что такое хороший способ с WebApi определить, было ли передано свойство или нет?
Если я определяю свой метод следующим образом:
[HttpPut]
[Route("/item/{id}")]
public void ChangeItem(int id, Item item)
{
...
}
item.Colour
в любом случае будет нулевым. Обратите внимание, что я работаю с различными типами данных здесь, а свойство Colour
в этом примере может быть int
, string
, DateTime
, Guid
и т.д.
Я понимаю, что я могу получить сырой json с атрибутом [FromBody]
, а затем проанализировать его сам, но похоже, что связующее по умолчанию уже выполняет большую часть работы (включая проверку), поэтому мне было бы интересно, как я могу повторно использовать его, но и добиться того, чего я хочу. Что является самым простым способом?
Обновление
Я хотел бы уточнить, что шахта - это "случайно связанный" сценарий. То есть устройства, использующие API, большую часть времени не имеют сетевого покрытия, и они время от времени синхронизируются с использованием API.
Практически это означает, что большинство данных, которые необходимы для синхронизации, агрегируются в нуль или один вызов "push update to server", за которым следует вызов "получить последнее состояние от сервера". С Sql Server и EF в back-end, что приводит к нескольким различным (а иногда и не связанным) объектам, содержится в одном json. Например:
class TaskData
{
public IList<User> AssignedUsers {get; set;}
public IList<Product> Products {get; set;}
public Task Task {get; set}
}
Кроме того, классы моделей, которые используются для генерации вызовов json для GET, отделены от EF Entites, поскольку схема базы данных точно не соответствует объектной модели API.