c# - tutorial - nhibernate vs entity framework
muchos-a-muchos con columnas adicionales nhibernate (1)
Entonces tengo dos tablas Users
y Groups
. Estas tablas son (en la base de datos) del agrado de una tabla de enlaces UGlink
. Ahora, a excepción de las claves externas principales, la tabla de enlaces tiene una columna adicional: Date
.
Por lo que entiendo, esto significa que tengo que tener dos Muchos-a-Uno, con el enlace "en el medio".
Sin embargo, dado que casi nunca estoy interesado en el valor extra de la columna, ¿hay alguna forma de evitar el enlace? Es decir, quiero poder escribir:
thisUser.Groups
para obtener los grupos, en lugar de:
thisUser.UGlinks.Group
El many-to-many
, sin el mapeo explícito de la tabla de emparejamiento como una entidad, está en NHibernate, por supuesto, apoyado. Por lo tanto, en el caso de que la columna Fecha sea autogenerada o anulable (no tiene que ser insertada por la aplicación / NHiberante) , podemos hacerlo como aquí: 6.8. Asociaciones bidireccionales
<class name="User">
<id name="Id" column="Uid"/>
...
<bag name="Groups" table="UGlink" lazy="true">
<key column="Uid"/>
<many-to-many class="Group" column="Gid"/>
</bag>
</class>
<class name="Group">
<id name="id" column="Gid"/>
...
<!-- inverse end -->
<bag name="Users" table="UGlink" inverse="true" lazy="true">
<key column="Gid"/>
<many-to-many class="User" column="Uid"/>
</bag>
</class>
Entonces, lo que tenemos es un mapeo, en el cual a NHiberante le importa la tabla de emparejamiento, y podemos hacer:
thisUser.Groups
Pero si pudiera sugerir, no vaya con many-to-many
. El objeto de emparejamiento de muchos a uno es (diría) una mejor solución, ya que admitirá la búsqueda de usuarios por grupos y viceversa.
Consulte el Capítulo 24. Mejores prácticas , cite:
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.
Aquí hay una explicación más detallada de cómo hacerlo sin muchos a muchos: Nhibernate: ¿Cómo representar las relaciones de muchos a muchos con relaciones de uno a muchos?