Reparación con avería tendrá relación one to many y avería con
reparación una many-to-one.
Tu base de datos ya está mal.
Si tienes una avería, la cual puede tener 0 o n reparaciones puedes
tener una tabla como esta:
table averia{
id, -> PK
campo1,
campo2,
etc
}
Y tu tabla reparaciones debería ser:
CREATE TABLE Reparaciones
(
id_reparacion, --> PK
id_averia, --> FK a la tabla averia
reparador nvarchar(50) ,
fecha_reparacion datetime
)
De esta forma, una avería puede no tener reparaciones y a su vez una
reparación no puede existir sin una avería... digo yo...
Al hacer el mapeo, la entidad Averia tendrá una lista de Reparaciones
(List<Reparaciones> o ISet o lo que sea para relación 1 a n, one to
many). La lista puede no contener elementos. Estará pendiente de
reparar si Avería.Reparaciones.Count = 0.
Tu entidad reparación, tendrá una propiedad de tipo Avería (relación
many to one)
Cuando a una avería quieres agregarle una reparación, tendrás que
hacer:
Avería.Reparaciones.Add(Reparacion);
Reparacion.Averia = Averia;
Cuando persistas la averia, se persistirá todo.
Entendido?
On 15 jul, 17:24, Fabio Maulo <[email protected]> wrote:
> 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