2009-11-03 2 views
17

Я успешно написал систему, содержащую заказ с строками младшего порядка, используя каскадные обновления из порядка, чтобы сохранить строки заказа. На следующей итерации я хочу связать строки порядка с классом десепшн. Это выглядело довольно прямолинейно: добавьте нулевой столбец DespatchID в таблицу строки заказа в качестве ключа foriegn в таблицу Despatch. Тем не менее, когда я добавляю это к отображению и сохраняю объект заказа с дескрипторами, не установленными в строках заказа, я получаю сообщение об ошибке «объект ссылается на несохраненный экземпляр переходного процесса» - сохраняет временный экземпляр перед промывкой ».Ошибка NHibernate - сохранить переходный экземпляр перед очисткой

Если я удаляю связь между строкой заказа и отправкой, она сохраняет ОК. Я могу только предположить, что ошибка вызвана тем, что она пытается сохранить отправку, которой не существует.

Вот отображения (класс линий порядка называется OrderProductAmount):

<class name="NHS.WebTeam.PandemicFluDistribution.Order, NHS.WebTeam.PandemicFluDistribution" table="[Order]" lazy="false" optimistic-lock="version" where="Deleted=0" > 
    <id name="ID" type="Int32" column="OrderID" unsaved-value="0"> 
     <generator class="hilo"> 
     <param name="table">NHibernateHiLo</param> 
     <param name="column">NextValue</param> 
     <param name="max_lo">100</param> 
     </generator> 
    </id> 

    <version column="version" name="Version"/> 
    <property name="Deleted" column="Deleted" /> 

    <property name="DateEntered"></property> 
    <property name="RequiredDeliveryDate"></property> 

    <many-to-one name="Practice" column="PracticeID"></many-to-one> 

    <set name="OrderProductAmounts" access="field.camelcase-underscore" inverse="true" cascade="all-delete-orphan" lazy="true"> 
     <key column="OrderID"></key> 
     <one-to-many class="NHS.WebTeam.PandemicFluDistribution.OrderProductAmount, PandemicFluDistribution" /> 
    </set> 

    </class> 

    <class name="NHS.WebTeam.PandemicFluDistribution.OrderProductAmount, NHS.WebTeam.PandemicFluDistribution" table="OrderProductAmount" lazy="false" optimistic-lock="version" where="Deleted=0" > 
    <id name="ID" type="Int32" column="OrderProductAmountID" unsaved-value="0"> 
     <generator class="hilo"> 
     <param name="table">NHibernateHiLo</param> 
     <param name="column">NextValue</param> 
     <param name="max_lo">100</param> 
     </generator> 
    </id> 

    <version column="version" name="Version"/> 
    <property name="Deleted" column="Deleted" /> 

    <many-to-one name="Order" column="OrderID"></many-to-one> 
    <many-to-one name="ProductAmount" column="ProductAmountID"></many-to-one> 
    <many-to-one name="Despatch" column="DespatchID" cascade="none" not-null="false"></many-to-one> 
    </class> 

    <class name="NHS.WebTeam.PandemicFluDistribution.Despatch, NHS.WebTeam.PandemicFluDistribution" table="Despatch" lazy="false" optimistic-lock="version" where="Deleted=0" > 
    <id name="ID" type="Int32" column="DespatchID" unsaved-value="0"> 
     <generator class="hilo"> 
     <param name="table">NHibernateHiLo</param> 
     <param name="column">NextValue</param> 
     <param name="max_lo">100</param> 
     </generator> 
    </id> 

    <version column="version" name="Version"/> 
    <property name="Deleted" column="Deleted" /> 

    <property name="DateDespatched"></property> 
    <property name="RequiredDeliveryDate"></property> 

    <many-to-one name="Practice" column="PracticeID"></many-to-one> 

    <set name="OrderProductAmounts" access="field.camelcase-underscore" inverse="true" cascade="none" lazy="true"> 
     <key column="DespatchID"></key> 
     <one-to-many class="NHS.WebTeam.PandemicFluDistribution.OrderProductAmount, PandemicFluDistribution" /> 
    </set> 

    </class> 

Код для создания заказа по существу это:

Dim practice = ... get relevant Practice ... 
Dim productAmount = ... get relevant ProductAmount ... 
Dim newOrder as Order = new Order(practice) 
newOrder.AddProductAmount(new OrderProductAmount(newOrder, productAmount) 
OrderDAO.Save(newOrder) 

ли кто-нибудь есть какие-нибудь идеи?

+1

Я уверен, что вы ссылаетесь на класс отправки здесь. Покажите мне код, в котором экземпляр создан или загружен и сохранен ... –

+0

Я добавил приближение кода, который создает заказ на вопрос. Я еще не написал бит, который добавляет отправку в строки порядка, поэтому я бы не подумал, что между ними еще будет связь. –

+2

Когда вы создаете объект Order, какое значение присваиваете свойству Despatch? Если это не NULL, а вместо этого является объектом Despatch с его Id = 0, я думаю, что NHibernate выкинет это исключение. –

ответ

21

Как следует из комментариев выше (для чего большое спасибо), было что-то, что не звучало правильно в отношении отправки. И, как оказалось, «Отправка» не была проблемой. Хотя по какой-то причине он работал, прежде чем я добавил его.

Я решил эту проблему, добавив каскад = «все» по ссылке OrderProductAmount на заказ:

<many-to-one name="Order" column="OrderID" cascade="all"></many-to-one> 

Ошибка, которая была брошена в том, что орден был еще переходная, когда OrderProductAmount был спасаемых. Это очень сбивает с толку, так как именно заказ, а не OrderProductAmount, который я сохраняю, - OrderProductAmounts сохраняются только через каскад из Ордера.

Итак, если у кого-нибудь есть идеи, почему это может быть, мне было бы интересно узнать.

+2

Спасибо, что поделились своим ответом. Добавление ссылки .Cascade.All() в Foreign table устранило ошибку выше для меня. – iniki

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

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