Подтвердить что ты не робот

NHibernate Error - сохранить переходный экземпляр перед промывкой

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

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

Вот сопоставления (класс строк порядка называется 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)

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

4b9b3361

Ответ 1

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

Я решил проблему, добавив каскад = "все" в ссылку OrderProductAmount к Order:

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

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

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