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