Atributo Inverso en NHibernate


¿Cómo uso el atributo Inverso? Si no me equivoco, para una a muchas relaciones el atributo inverso debe ser establecido en verdadero. Para las relaciones de muchos a muchos, uno de los atributos inversos de la clase de entidad debe establecerse en true y otro en false.

¿Alguien puede arrojar algo de luz sobre esto?
Author: Rap, 2009-04-03

3 answers

El atributo inverse no debe ser establecido en true ...

Se utiliza el atributo inverso para especificar el 'propietario' de la asociación. (Una asociación solo puede tener un propietario, por lo que un extremo tiene que ser inverso, el otro tiene que ser 'no inverso'). (Propietario: inverse=false; No propietario: inverse=true)

En una asociación de uno a muchos, si no marca la colección como el extremo inverso, entonces NHibernate realizará una ACTUALIZACIÓN adicional. De hecho, en este caso, NHibernate primero insertará el entidad que está contenida en la colección, si es necesario insertar la entidad que posee la colección, y luego, actualiza la 'entidad de colección', de modo que se establece la clave foránea y se realiza la asociación. (Tenga en cuenta que esto también significa que la clave foránea en su base de datos debe ser nullable).

Cuando marca el fin de la colección como 'inverso', entonces NHibernate primero persistirá la entidad que 'posee' la colección, y persistirá las entidades que están en la colección después, evitar una declaración de ACTUALIZACIÓN adicional.

Así que, en una asociación bidireccional, siempre tienes un extremo inverso.

 119
Author: Frederik Gheysels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-25 02:27:08

Además de la respuesta anterior , y según mi entendimiento, debe persistir el valor de la clave foránea en la colección manualmente, es decir, si no desea la instrucció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 mayor explicación del atributo inverso, verifique el siguiente post:

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

 9
Author: Emad Alashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:05

Puedo ver dónde entra el "propietario", pero una asociación es una tubería, y puedes mirar hacia abajo en cada extremo, así que qué quiere decir qué entidad "posee" la tubería.

Una forma diferente de ver esto es, que en un Uno a Muchas relaciones, hay realmente 2 relaciones pasando.

Relación 1: Padre de Muchos Hijos.

Relación 2: Cada Hijo con un Padre

Entonces NH intentará ejecutar sql para almacenar cada uno de estos en la base de datos. Pero no es necesario porque cuando se establece la Clave Foránea, por ejemplo, en la Relación 2 cuando se almacena un hijo, entonces automáticamente se ha fijado la relación de un padre al hijo también porque la Relación 1 es el "Inverso" de la Relación 2.

Así que inverso significa, es algo que obtenemos por defecto una vez que hemos establecido la relación principal. es decir, no hay necesidad de que NH ejecute sql para arreglar la Relación 1 y al marcar la colección infantil como Inversa, NH omitirá ejecutar sql cuando la colección infantil sea añadido a.

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

 2
Author: Mickey Puri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-14 22:36:47