Как реализовать частичные обновления (ИСПРАВЛЕНИЕ) в Restful Web API (.NET / JSON / EF6) на стороне сервера

#c# #json #rest #entity-framework-6 #patch

#c# #json #rest #entity-framework-6 #исправление

Вопрос:

Я работал над проектом веб-API (Restful), где размер моделей (и соответствующей таблицы) довольно огромен, поэтому существует абсолютная потребность в частичных обновлениях.

Я рассмотрел вариант публикации в подраздел модели, но, учитывая, что модель имеет огромное количество полей (и настраиваемых полей), не думаю, что возможно предоставить такое количество URI).

Я понимаю, что с помощью PATCH verb я могу разрешить клиенту выполнять частичные обновления, но я изо всех сил пытаюсь понять, как я должен фиксировать то же самое на стороне сервера, а затем выяснить, что изменилось (преобразование post JSON в model), чтобы я мог различать, какие поля заданы явнокак NULL клиентом (поскольку она хотела обновить поле) Против. что равно NULL в результате отсутствия обновления.

Должен ли я использовать пользовательский mapper? или я должен создавать общие свойства и фиксировать состояние на уровне поля?

Я искал (и все еще делаю) в сети и здесь SOF.com , но я не нашел ничего авторитетного / конкретного, поэтому обращаюсь к профессионалам за обратной связью.

ценю вашу помощь!

Ответ №1:

KevinDockx создал плагин для MVC, который обрабатывает ИСПРАВЛЕНИЯ. Вот ссылка на nuget https://www.nuget.org/packages/Marvin .JsonPatch /

Этот плагин является реализацией RFC 6902 для .NET..

по сути, когда вы отправляете исправление json со своего клиента, вам необходимо создать массив операций

 [
    { "op": "add", "path": "/foo", "value": "bar"},
    { "op": "replace", "path": "/baz", "value": "boo" }
]
  

Конечно, это имеет значение только в том случае, если вы хотите следовать спецификации. В другом случае (я имею в виду ваше собственное понимание того, как работает ИСПРАВЛЕНИЕ) вы должны реализовать свою пользовательскую логику.

Редактировать

Лично я обнаружил, что только операция «заменить» была полезна в моих вариантах использования из-за плоской природы моих DTO.