Как мне сериализовать / десериализовать сущность NHibernate, которая имеет ссылки на другие объекты? - PullRequest
0 голосов
/ 07 мая 2010

У меня есть два объекта, управляемых NHibernate, которые имеют двунаправленное отношение один ко многим:

public class Storage
{
    public virtual string Name { get; set; }
    public virtual IList<Box> Boxes { get; set; }
}

public class Box
{
    public virtual string Box { get; set; }
    [DoNotSerialize] public virtual Storage ParentStorage { get; set; }
}

A Storage может содержать множество Boxes, а Box всегда принадлежит Storage. Я хочу отредактировать имя Box's, поэтому отправляю его клиенту, используя JSON. Обратите внимание, что я не сериализую ParentStorage, потому что я не изменяю, в каком хранилище он находится.

Клиент редактирует имя и отправляет Box обратно как JSON. Сервер десериализует его обратно в Box сущность.

Проблема в том, что свойство ParentStorage равно нулю. Когда я пытаюсь сохранить Box в базе данных, он обновляет имя, но также удаляет связь с Storage.

Как правильно сериализовать и десериализовать сущность, подобную Box, сохраняя при этом размер данных JSON минимальным?

Ответы [ 2 ]

2 голосов
/ 07 мая 2010

Я бы порекомендовал вам отправить клиенту DTO для отображения (и он должен содержать уникальный идентификатор базы данных). Затем отправьте boxId + новое имя обратно на сервер с клиента (нет необходимости отправлять весь DTO обратно). Сервер может выполнить поиск в базе данных, используя идентификатор, чтобы получить объект блока, обновить поле имени до поля, отправленного клиентом, и сохранить блок в базе данных.

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

0 голосов
/ 07 мая 2010

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

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

...