Hola gente,

Me ha surgido algún que otro problema a la hora de mapear las
entidades de un dominio, no se por donde cogerlo y necesito ideas.

En mi dominio manejo dos tipos de entidades, las que llamo Entidades
por que tienen un Id y una versión y otras entidades de más peso que
heredan de entidad pero también tienen nombre, descripción y un flag
de activación/desactivación. A estas últimas las he llamado
"Elementos", en código son esto:

    public class Entidad
    {
        public virtual int Id { get; set; }
        public virtual int Version { get; set; }
    }

    public class Elemento : Entidad
    {
        public virtual string Nombre { get; set; }
        public virtual string Descripcion { get; set; }
        public virtual bool Desactivado { get; set; }
        public virtual IList<Elemento> ElementosRelacionados { get;
set; }
    }

La clase Elemento también tiene una lista de otros elementos que
están, por algún motivo, relacionados en él mismo.

Bien, todas las entidades de mi dominio heredan de entidad o elemento,
como ejemplo tengo entidades llamadas, Persona, Tarea, Documento y
Ejecutor, este es el diagrama de clases que forman:

http://jros.org/files/orm/elementos.png

Como podéis ver Persona, Ejecutor, Tarea y Documento heredan directa o
indirectamente de Elemento.
Para el caso quiero usar table-per-concrete-class para mapear mis
entidades, y el problema me viene en que no se como mapear la
propiedad "ElementosRelacionados" para cada una de las clases
concretas.

Pensándolo un poco mi idea es usar una tabla llamada "Relaciones"
donde relacionar las entidades, teniendo como campos "ClaseElemento1",
"ClaseElemento2", "IdElemento1" y "IdElemento2". En los dos primeros
pondría el nombre de la clase del elemento y en los segundos los
Identificadores.

Todo esto debería funcionar teniendo en cuenta:

1) Cualquier elemento se puede relacionar con cualquier otro. Hoy son
Documento, Tarea, Persona y Ejecutor, pero mañana pueden aparecer
Expediente, Proyecto, Factura, ... Me gustaría hacerlo de forma
genérica para que me valga para cualquier tipo de entidad.

2) Un Documento puede estar relacionado con una Tarea y viceversa.
Cuando voy a buscar los Elementos relacionados con una Tarea, debo
mirar en la tabla de relaciones si se encuentra como Elemento1 o como
Elemento2, a ambos lados de la relación.

En fin, me ha parecido lo suficientemente interesante como para
plantearlo aquí.

Aquí van las tablas como más o menos las tengo pensadas:
http://jros.org/files/orm/tablas1.png

Alguna idea?


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