#json #nhibernate
#json #nhibernate
Вопрос:
Учитывая оптимистичный параллелизм с использованием свойства version и rest-сервиса json с клиентом, который возвращает наборы изменений, состоящие только из идентификатора, версии и измененных свойств, как я могу обновить свой объект на стороне сервера?
То, что я хотел сделать, это десериализовать мой json в отдельный объект, а затем использовать ISession.Метод слияния для обновления моей сущности. Однако моя отдельная сущность будет иметь нулевые значения для многих свойств, и моя сущность будет обновлена со всеми из них, если я вызову merge, чего я не хочу. Если есть способ указать merge игнорировать свойства, которые являются нулевыми, и сохранить любые соответствующие ненулевые значения из сохраняемого объекта, это решило бы мою проблему.
Если нет способа настроить поведение для слияния, я, конечно, мог бы получить сохраненный объект и реализовать свой собственный метод слияния с использованием отражения. Проблема с этим подходом заключается в том, что он требует, чтобы я сначала запрашивал базу данных для объекта, а затем обновлял ее, тогда как метод слияния должен выполнять это как одну операцию, если я не ошибаюсь.
Вы можете спросить, почему я хочу передавать только наборы изменений вместо полного объекта. Это потому, что это позволяет мне отправлять минимальные данные, а также четко указывает, что пользователь пытается изменить, что я могу использовать для проверки прав пользователей.
Если это невозможно сделать в рамках nhibernate, как бы вы поступили?
Комментарии:
1. я бы выбрал путь отражения. это займет еще один раунд, но избавит вас от множества хлопот. я думаю, вы можете настроить слияние с помощью пользовательского перехватчика, но я думаю, что это не стоит того, пока не будет доказано иначе
Ответ №1:
В итоге я использовал WCF Web API для своего приложения. Я использую пользовательский форматировщик мультимедиа, обертывающий Json.NET . Это позволяет мне десериализовать в общие и производные типы, что довольно здорово и очень полезно.
У меня есть ChangeSet
объект, который имеет несколько свойств, наиболее важным из которых является словарь значений имен. С помощью этой настройки я мог бы определять сервисные операции, использующие ChangeSet
объекты. Однако мне пришлось явно удалить XmlMediaFormatter
. Он выдавал ошибки, поскольку не смог бы десериализовать такие сложные объекты.
После проверки прав пользователей на изменение этих свойств я извлекаю объект из репозитория, обновляю свойства из набора изменений, используя отражение, и сохраняю его обратно в репозиторий.
Работает прекрасно, если честно. 🙂