Me gustaría explicar el trasfondo de por que me surgen estas cosas y
otras muchas que voy solucionando poco a poco, si no lo he hecho ya es
por no dar la tabarra y por que llevo muy poco tiempo usando un ORM y
me falta mucho por aprender. Muchas de las cosas que me han surgido
las he solucionado tan solo replanteándolas desde la raíz, pensando en
objetos y no en tablas, pero bueno, voy poco a poco.
A ver si aclaro mis ideas y saco un poco de tiempo y os cuento.
Volviendo al tema: many-to-any es más o menos lo que buscaba, he
encontrado este ejemplo:
<set name="animals" table="robot_animals">
<key column="robot_id"/>
<many-to-any id-type="long">
<column name="animal_class" not-null="true"/>
<column name="animal_id" not-null="true"/>
</many-to-any>
</set>
Lo que no se es como NHibernate sabe de que columna coger la clase y
de cual el id, supongo que será por el orden de las columnas en el
XML.
De lo poco que he encontrado en la referencia de NHibernate es:
"The <many-to-any> and <index-many-to-any> elements provide for true
heterogeneous associations. These mapping elements work in the same
way as the <any> element - and should also be used rarely, if ever."
Supongo que al ser un caso extraño no se ha documentado mucho.
Continuando; con many-to-any podría solucionar el problema creando una
tabla de relaciones por cada elemento, de forma que por las clases
Tarea, Documento, Persona, ... debería crear las tablas
TareaRelaciones, DocumentoRelaciones, PersonaRelaciones, ... pero aquí
surge una pega. Si a la "Tarea 4" le asocio el "Documento 3", guardará
la relación en la tabla TareaRelaciones. Cuando carge la tarea 4
tendré el documento 3 como elemento relacionado, el problema es que
cuando cargue el "documento 3" irá a cargar las relaciones en la tabla
DocumentoRelaciones y no encontrará la relación con la "tarea 4".
Es por esto que mi idea inicial era tener todas las relaciones en una
misma tabla.
Tendría que buscar la forma de decirle al many-to-any como montar el
where para buscar las relaciones y como extraer la entidad
relacionada.
Algo así:
<set name="ElementosRelacionados" table="Relaciones">
<many-to-any-TwoWay-EXTREME>
<class-key-columns column1="ClaseElemento1"
column2="ClaseElemento2"/>
<id-key-columns column1="IdElemento1" column2="IdElemento2"/>
</many-to-any-TwoWay-EXTREME>
</set>
Quizás suene a risa :?, pero con algo así se podrían relacionar todo
tipo de entidades dentro de un dominio.
Quizás me esté complicando la vida profesional :?, pero esto me ahorra
editar muchos mappings y da una versatilidad extraordinaria en un
dominio cualquiera.
Saludos,
On 14 dic, 11:18, Fabio Maulo <[email protected]> wrote:
> Para mi te estas complicando mucho la vida professional... de todas formas
> estas buscando: many-to-any
>
> 2010/12/13 tolemaC <[email protected]>
>
>
>
>
>
> > 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
>
> --
> 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