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
