Отображение nhibernate: удалить коллекцию, вставить новую коллекцию со старыми идентификаторами - PullRequest
0 голосов
/ 31 марта 2010

моя проблема похожа на эту: (ссылка)

но у меня связь один-ко-многим:

<set name="Fields" cascade="all-delete-orphan" lazy="false" inverse="true">
  <key column="[TEMPLATE_ID]"></key>
  <one-to-many class="MyNamespace.Field, MyLibrary"/>
</set>

(я тоже пытался использовать) это отображение для шаблона объекта. для этого объекта и Field их идентификаторы генераторов установлены на identity .

поэтому, когда я вызываю session.Update для объекта Template, он работает нормально, ну почти: если объект Field имеет номер Id, вызывается SQL-запрос UPDATE, если Id равен 0, выполняется INSERT. Но если я удаляю объект Field из коллекции, он не влияет на базу данных. Я обнаружил, что если я также вызову session.Delete для этого объекта Field, все будет хорошо, но из-за архитектуры клиент-сервер я не знаю, что удалить.

поэтому я решил удалить все элементы коллекции из БД и вызвать сессию. Обновите новую коллекцию. и у меня возникла проблема: nhibernate выполняет операцию UPDATE для объектов Field с ненулевым Id, но они удаляются из БД!

может быть, мне стоит использовать какой-нибудь другой генератор Id или что-то в этом роде ... Каков наилучший способ заставить nhibernate выполнить процедуру «удалить все» / «вставить все» для коллекции?

1 Ответ

2 голосов
/ 31 марта 2010

Связываемая вами сущность уже связана с сеансом? (т.е. вы загружаете объект и изменяете этот загруженный экземпляр)?

Звучит так, будто вы пытаетесь указать nhibernate обновить отдельную сущность, в этом случае nhiberante не может знать, какие сущности были добавлены / удалены в коллекции. В этом случае вы можете использовать Merge:

var mergedEntity = session.Merge(entityPasedFromClient)

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

Я не уверен, что понимаю последнюю часть вашего вопроса: "поэтому я решил удалить все элементы коллекции из БД и вызвать сессию. Обновите новую коллекцию. У меня возникла проблема: nhibernate выполняет операцию UPDATE для объектов Field с ненулевым Id, но они удален из БД!

Обновлены ли элементы поля, а затем удалены?

...