Как я могу обновить свои объекты с помощью набора изменений json?

#json #nhibernate

#json #nhibernate

Вопрос:

Учитывая оптимистичный параллелизм с использованием свойства version и rest-сервиса json с клиентом, который возвращает наборы изменений, состоящие только из идентификатора, версии и измененных свойств, как я могу обновить свой объект на стороне сервера?

То, что я хотел сделать, это десериализовать мой json в отдельный объект, а затем использовать ISession.Метод слияния для обновления моей сущности. Однако моя отдельная сущность будет иметь нулевые значения для многих свойств, и моя сущность будет обновлена со всеми из них, если я вызову merge, чего я не хочу. Если есть способ указать merge игнорировать свойства, которые являются нулевыми, и сохранить любые соответствующие ненулевые значения из сохраняемого объекта, это решило бы мою проблему.

Если нет способа настроить поведение для слияния, я, конечно, мог бы получить сохраненный объект и реализовать свой собственный метод слияния с использованием отражения. Проблема с этим подходом заключается в том, что он требует, чтобы я сначала запрашивал базу данных для объекта, а затем обновлял ее, тогда как метод слияния должен выполнять это как одну операцию, если я не ошибаюсь.

Вы можете спросить, почему я хочу передавать только наборы изменений вместо полного объекта. Это потому, что это позволяет мне отправлять минимальные данные, а также четко указывает, что пользователь пытается изменить, что я могу использовать для проверки прав пользователей.

Если это невозможно сделать в рамках nhibernate, как бы вы поступили?

Комментарии:

1. я бы выбрал путь отражения. это займет еще один раунд, но избавит вас от множества хлопот. я думаю, вы можете настроить слияние с помощью пользовательского перехватчика, но я думаю, что это не стоит того, пока не будет доказано иначе

Ответ №1:

В итоге я использовал WCF Web API для своего приложения. Я использую пользовательский форматировщик мультимедиа, обертывающий Json.NET . Это позволяет мне десериализовать в общие и производные типы, что довольно здорово и очень полезно.

У меня есть ChangeSet объект, который имеет несколько свойств, наиболее важным из которых является словарь значений имен. С помощью этой настройки я мог бы определять сервисные операции, использующие ChangeSet объекты. Однако мне пришлось явно удалить XmlMediaFormatter . Он выдавал ошибки, поскольку не смог бы десериализовать такие сложные объекты.

После проверки прав пользователей на изменение этих свойств я извлекаю объект из репозитория, обновляю свойства из набора изменений, используя отражение, и сохраняю его обратно в репозиторий.

Работает прекрасно, если честно. 🙂