Hola a todos, soy nuevo aquí.

Llevo ya demasiadas horas detrás del siguiente problema y recurro a
este foro a ver si alguien me pueda ayudar.

El caso es que tengo una relacion de herencia entre dos clases :
averías y reparaciones, en la que una avería puede tener UNA o NINGUNA
reparación.

Doy de alta una avería sin problemas, pero al intentar dar de alta la
reparación de esa avería obtengo este error :

"a different object with the same identifier value was already
associated with the session"

Al parecer nh intenta ejecutar un UPDATE de la reparación en lugar de
un INSERT

A ver si no me extiendo mucho. He simplificado el problema en el
siguente código (uso VB). Las clases vienen a ser algo así

        Class Averias
                Averia As System.Int32 = 0  ' el identificador
                Descripcion As System.String
                Fecha As System.Nullable(Of System.DateTime)
                Reparaciones As IList(Of Reparaciones) = New List(Of 
Reparaciones)()
        End Class

        Class Reparaciones Inherits Averias
                Averia As System.Int32 ' el Identificador y tambien FK
                Reparador As System.String
                Fecha_reparacion As System.Nullable(Of System.DateTime)
        End Class

La idea es que si una avería no tiene reparación asociada, está
pendiente de reparar. Lógico, no ? Ademas uso herencia por que me
permite, entre otras cosas, dar de alta una reparación y su avería
asociada de una vez.

El mapeo que he hecho es + o - :

<class name="Averias" table="averias" >
    <id name="Averia" type="System.Int32" column="averia">
        <generator class="identity"/>
    </id>
    <property name="Descripcion" column="descripcion"
type="System.String"/>
    <property name="Fecha" column="fecha" type="System.DateTime"  />

    <joined-subclass name="Reparaciones" table="reparaciones">
       <key column="averia" />
       <property name="Reparador" column="reparador"
type="System.String"/>
       <property name="Fecha_reparacion" column="fecha_reparacion"
type="System.DateTime"/>
    </joined-subclass>
</class>


La la tabla de Averías no tienen nigún misterio salvo que su ID es un
autonumérico. No incluyo su estructura.
La de Reparaciones tiene esta peculiaridad: su ID es a su vez la
foreign key a la averia asociada. De esta forma evito que existan
varias reparaciones de una avería.

CREATE TABLE Reparaciones
(
        averia int NOT NULL PRIMARY KEY, /* es ID y referencia  */
        reparador nvarchar(50) ,
        fecha_reparacion datetime
)

ALTER TABLE Reparaciones
ADD  CONSTRAINT [FK_reparaciones_averias] FOREIGN KEY ( averia )
REFERENCES Averias ( averia )

Y que pasa ? pues que al ejecutar esto :

        'paso 1. Registramos una nueva averia. Debe dar de alta un registro
en Averias

        Dim mi_averia As New Averias

        mi_averia.Descripcion = "Fuga en caldera de gas"
        mi_averia.Fecha = System.DateTime.Now

        averias_dao.SaveOrUpdate(mi_averia) 'todo OK


        'paso 2. Damos de alta la reparación. Debería dar un alta en la tabla
Reparaciones

        Dim mi_reparacion As New Reparaciones

        mi_reparacion.Averia = mi_averia.Averia 'asignamos el ID de la avería
        mi_reparacion.Fecha_reparacion = System.DateTime.Now
        mi_reparacion.Reparador = "Pepe Gotera"

        reparaciones_dao.SaveOrUpdate(mi_reparacion) ' Error !

Nhibernate intenta un UPDATE en lugar de un INSERT.  Es un fallo de
NHibernate, o es un error mío ?

Por lo que he visto en este foro hay un parametro unsaved-value que
permite diferenciar un alta de una modificacion.Puedo usarlo aquí  ?

Gracias por leerme, si alguien tiene alguna idea se lo agradeceré .


-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a