2009-11-03 13 views
17

Escribí con éxito un sistema que contenía una orden con líneas de orden secundarias, usando actualizaciones en cascada de la orden para guardar las líneas de orden. En la siguiente iteración, quiero asociar las líneas de orden con una clase de despacho. Esto parecía bastante sencillo: agregue una columna DespatchID que admite nulos a la tabla de líneas de pedido como una clave de acceso a la tabla Despacho. Sin embargo, cuando agrego esto a la asignación y guardo el objeto de orden con los despachos no configurados en las líneas de orden, aparece el error "el objeto hace referencia a una instancia transitoria no guardada: guarde la instancia transitoria antes de enjuagar".NHibernate Error: guarde la instancia transitoria antes de enjuagar

Si elimino la asociación entre la línea de pedido y el envío, se guarda OK. Solo puedo suponer que el error se debe a que está intentando guardar el envío, que no existe.

Estas son las asignaciones de la clase (líneas orden se llama 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> 

El código para crear la orden es esencialmente la siguiente:

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) 

¿Alguien tiene alguna idea?

+1

Estoy seguro de que está haciendo referencia a una clase de envío aquí. Muéstreme el código donde se crea o carga y almacena la instancia ... –

+0

Agregué una aproximación del código que crea el orden de la pregunta. Todavía no he escrito el bit que agrega el despacho a las líneas de pedido, así que no hubiera pensado que todavía habría una asociación entre ellos. –

+2

Cuando crea el objeto Order, ¿qué valor asigna a la propiedad Despatch? Si no es un NULL, y en su lugar es un objeto Despatch con su Id = 0, creo que NHibernate arrojará esa excepción. –

Respuesta

21

Tal como lo implican los comentarios anteriores (por los cuales muchas gracias), hubo algo que no sonó bien con respecto al envío. Y, como resultó, el Despacho no fue el problema. Aunque por alguna razón funcionó antes de que lo agregara.

que ha resuelto el problema mediante la adición de una cascada = "all" para el enlace OrderProductAmount a la Orden:

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

El error que fue lanzado era que la Orden era todavía transitoria cuando el OrderProductAmount se está guardando. Esto es muy confuso, ya que es el Pedido y no el Pedido de Producto lo que estoy ahorrando, los OrderProductAmounts solo se guardan a través de una cascada del Pedido.

Por lo tanto, si alguien tiene alguna idea de por qué esto podría ser, me gustaría saber.

+2

Gracias por compartir tu respuesta. La adición de .Cascade.All() a la referencia de tabla foránea resolvió el error anterior para mí. – iniki

Cuestiones relacionadas