Me parece que te enredaste...
En tu dominio una *Avaria es una Reparacción*

Lo que queres hacer es, probablemente, que un Reparacción tenga la referecia
a la Avaria.

2010/7/15 Edu <[email protected]>

>
> 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




-- 
Fabio Maulo

-- 
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