Лучший способ сохранить родительский объект - PullRequest
1 голос
/ 24 сентября 2011

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

В моем случае Родитель передается на мой сервисный уровень с веб-страницы. Веб-страница содержит только простые атрибуты Родителя из формы.

Я знаю, что в базе данных есть несколько дочерних объектов, связанных с Родителем, но свойство 'children' в настоящее время равно нулю.

Если я сохраняю Parent, даже если для my of Children установлено значение cascade = "none", при сохранении Parent удаляются все ссылки (я даже вижу проблемы с операторами NHibernate в журналах).

Я могу придумать несколько способов решить эту проблему:

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

2) Выпустите обновление ТОЛЬКО простых свойств с использованием HQL или Native SQL.

Обновление: я не уверен, что мое каскадное поведение на самом деле работает правильно. Из документов видно, что NHibernate не будет связываться с моей коллекцией, если только в каскаде не задано сохранение-обновление, удаление-удаление-сирота и т. Д. Но это мое отображение

(из Order.hbm.xml)

<bag name="OrderItems" table="order_item" cascade="none" lazy="true">
  <key column ="order_id" />
  <many-to-many class="MenuItem" column="item_id"/>
</bag>

Когда Order.OrderItems имеет значение null, и я сохраняю свой объект Order с помощью SaveOrUpdate (Order), он определенно удаляет коллекцию. Я хочу, чтобы они были сохранены. У меня неправильная конфигурация или что-то в этом роде?

Спасибо

1 Ответ

1 голос
/ 24 сентября 2011

Я бы на самом деле не использовал настоящий родительский объект для передачи данных из пользовательского интерфейса на сервисный уровень. Вместо этого вы можете реализовать легкий класс ( Объект передачи данных ), который будет содержать только эти базовые свойства, а затем передать его на уровень обслуживания и заполнить (либо вручную, либо с помощью AutoMapper ) родительский объект. свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...