2010-06-20 2 views
1

У меня есть родитель/ребенок отношение, и ребенок имеют композитный идентификаторNHibernate - проблема с сливающейся коллекцией

Родитель

<id name="Id" type="Int32"> 
     <generator class="identity" /> 
    </id> 

<set name="Children" table="CTable" cascade="all-delete-orphan" inverse="true" lazy="false" > 
    <key column="ParentId"/> 
    <one-to-many class="ChildrenClass"/> 
</set> 

Детских

<composite-id unsaved-value="none"> 
    <key-property name="ParentId"/> 
    <key-property name="ChildId"/> 
</composite-id> 

Что я хочу: 1) Получить Родительский из базы данных, закройте сеанс, передайте родителя от службы к клиенту 2) Когда родитель вернулся с клиента, сохраните его и все его дочерние элементы в БД, в новая сессия

На шаге 2 я вызываю var merged = Session.Merge (продукт);

Я использую Merge(), потому что это единственный способ сделать добавленные/удаленные элементы NHib в дочерней коллекции .. НО nHibernate сбрасывает все id-s в новых дочерних элементах, поэтому у меня есть новые дети с ParentId == 0 и ChildId == 0. Поэтому возникает вопрос: как сообщить NHibernate о продолжении идентификаторов от объекта, который передается в Merge()? .. Пожалуйста, помогите.

ответ

0

Неправильное отображение (и класс модели).

Ребенок должен иметь ссылку на родителя, а не на идентификатор. И картирование должно быть <key-many-to-one/>

+0

Спасибо за ваш ответ! Если я добавлю ссылку Child для родителя, как я могу сохранить сбор детей в родительском? Когда присутствуют ссылки Parent.Children & Child.Parent, это приводит к исключению StackOverflowException (очевидно). Я хотел бы иметь набор дочерних элементов в родительском объекте, чтобы я мог перемещаться по ним. Возможно ли это? – Dmitry

+0

«Очевидно»? Вы неправы. Двунаправленные отношения полностью поддерживаются NHibernate. Я предлагаю вам сначала прочитать документы. –

+0

Диего, мне удалось заставить его работать, не знаю, почему этого не произошло в первый раз. Благодаря! – Dmitry

Смежные вопросы