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

Responder a