varios una tabla solucion relacion muchos llenar intermedia ejemplos como nhibernate

nhibernate - una - relacion varios a varios



Nhibernate: ¿Cómo representar las relaciones de muchos a muchos con relaciones de uno a muchos? (1)

Simplemente llegué a esa pregunta y me di cuenta de que faltaba una respuesta. Y es una pena, aunque a menudo señalo esta declaración de documentación de NHibernate: 24. Mejores prácticas

No use mapeos de asociaciones exóticas.

Los buenos usos para asociaciones reales de muchos a muchos son raros. La mayoría de las veces necesita información adicional almacenada en la "tabla de enlaces". En este caso, es mucho mejor usar dos asociaciones de uno a muchos para una clase de enlace intermedio. De hecho, creemos que la mayoría de las asociaciones son uno a muchos y muchos a uno, debe tener cuidado al usar cualquier otro estilo de asociación y preguntarse si es realmente necesario.

Echa un vistazo al ejemplo debajo de 23.2. Autor / Trabajo . Extracto, la versión simplificada de la relación muchos a muchos entre Author y Work :

<class name="Work" table="works" ...> <id name="Id" column="id" generator="native" /> ... <set name="Authors" table="author_work" lazy="true"> <key> <column name="work_id" not-null="true"/> </key> <many-to-many class="Author"> <column name="author_id" not-null="true"/> </many-to-many> </set> </class>

Y su objetivo de muchos a muchos Autor:

<class name="Author" table="authors"> ... <set name="Works" table="author_work" inverse="true" lazy="true"> <key column="author_id"/> <many-to-many class="Work" column="work_id"/> </set> </class>

Entonces, si nos gustaría ordenar el conjunto de Works en carga, tenemos un problema. No hay una columna en la tabla de pares. Pero lo que es más importante, no hay forma de cómo administrar dicha columna.

Lo que podemos hacer es introducir el objeto Pair: AuthorWork y ampliar la tabla de pares según sea necesario

public class AuthorWork { public virtual Author Author { get; set; } public virtual Work Work { get; set; } public virtual int OrderBy { get; set; } }

Mapeo del AutorTrabajador

<class name="AuthorWork" table="author_work"> ... <many-to-one name="Author" column="author_id" /> <many-to-one name="Workr" column="work_id" /> <property name="OrderBy" />

Teniendo esto podemos convertir el mapeo de muchos a muchos a uno a muchos, por ejemplo, la colección de autores:

<set name="Authors" lazy="true" order-by="OrderBy"> <key column="work_id" not-null="true"/> <one-to-many class="AuthorWork" /> </set>

Y podemos administrar la entidad AuthorWork, establecer la columna OrderBy y, por lo tanto, trabajar de forma efectiva con la tabla de emparejamiento.

NOTA: tiene que estar de acuerdo con esa sugerencia en la documentación. Cuantos más requisitos se presenten, más felices estamos de que tengamos una forma de gestionar la relación.

He leído una publicación en Internet (ya no puedo encontrar esa publicación para mí) que una relación de Muchos a Muchos puede ser reemplazada por una relación uno a muchos. ¿Alguien puede dar un ejemplo?