one many classmapping nhibernate nhibernate-mapping

many - Atributo inverso en NHibernate



nhibernate sessionfactory connection string (3)

Además de la respuesta anterior , y según tengo entendido, debe mantener el valor de la clave foránea en la colección manualmente, es decir, si no desea la declaración de actualización adicional:

Parent par = Session.Get<Parent>(8); Child ch = new Child(); ch.Name = "Emad"; //set the parent foreign key manually ch.MyParent = par; par.MyChildren.Add(ch); Session.Save(par);

para una explicación más detallada del atributo inverso, verifique la siguiente publicación:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/

¿Cómo uso el atributo inverso? Si no me equivoco, para las relaciones de uno a muchos, el atributo inverso debe establecerse en verdadero. Para las relaciones de muchos a muchos, uno de los atributos inversos de clase de entidad debe establecerse en verdadero y otro establecerse en falso.

¿Alguien puede arrojar algunas luces sobre esto?


El atributo inverso no se debe establecer en verdadero ...

Usas el atributo inverso para especificar el ''propietario'' de la asociación. (Una asociación solo puede tener un propietario, por lo que un extremo debe establecerse en inverso, el otro tiene que estar configurado como ''no inverso''). (Propietario: inverse=false ; No propietario: inverse=true )

En una asociación uno a muchos, si no marca la colección como el extremo inverso, NHibernate realizará una ACTUALIZACIÓN adicional. De hecho, en este caso, NHibernate primero insertará la entidad que está contenida en la colección, si es necesario inserta la entidad propietaria de la colección, y luego, actualiza la ''entidad de recopilación'', de modo que se establezca la clave externa y la asociación está hecho. (Tenga en cuenta que esto también significa que la clave externa en su DB debe ser anulable).

Cuando marca el extremo de la colección como ''inverso'', NHibernate primero persistirá en la entidad que ''posee'' la colección, y persistirá en las entidades que están en la colección después, evitando una instrucción UPDATE adicional.

Entonces, en una asociación bidireccional, siempre tienes un extremo inverso.


Puedo ver dónde entra el "propietario", pero una asociación es una tubería, y se puede mirar hacia abajo a cada extremo, entonces, ¿qué decir qué entidad "posee" la tubería?

Una forma diferente de ver esto es que en las relaciones de Uno a Muchos, en realidad hay dos relaciones en curso.

Relación 1: Padre a muchos niños.

Relación 2: cada niño a un padre

Entonces NH intentará ejecutar sql para almacenar cada uno de estos en la base de datos. Pero no es necesario porque cuando configura la clave externa, por ejemplo, en la relación 2 cuando se almacena un hijo, también se ha corregido automáticamente la relación de un padre con el hijo porque la relación 1 es el "inverso" de la relación 2 .

Entonces, invertir significa que es algo que obtenemos por defecto una vez que establecemos la relación principal. es decir, no hay necesidad de que NH ejecute sql para reparar la relación 1 y marcando la colección secundaria, ya que un NH inverso omitirá ejecutar sql cuando se agregue la colección de elementos secundarios.

Asumiría que si no le dijeras a NH que era un inverso, desperdiciarías esfuerzo al hacer sql para tratar de establecer la relación inversa también, aunque no era necesario.