Atributo inverso en NHibernate

89

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

¿Alguien puede arrojar algo de luz sobre esto?

Graviton
fuente
2
También puede verificar mi respuesta, " Cuándo usar inverso =" verdadero | falso " ", en una pregunta similar.
Daniel Schilling

Respuestas:

125

El atributo inverso no debe establecerse en verdadero ...

Utiliza el atributo inverso para especificar el 'propietario' de la asociación. (Una asociación puede tener un solo propietario, por lo que un extremo debe establecerse en inverso, el otro debe establecerse en '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 final 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 la colección', para que se establezca la clave foránea y la asociación está hecho. (Tenga en cuenta que esto también significa que la clave externa en su base de datos debe ser anulable).

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

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

Frederik Gheysels
fuente
4
Esto explica todo, solo para agregar propietario es uno que tiene una clave externa en la tabla
Brijesh Mishra
48
En mi opinión, esta es una terminología realmente mala. ¿Por qué no marcar la propiedad en lugar de la 'inversa'?
UpTheCreek
1
+1 para usar la negación en un término ya negado :) "El atributo INVERSE NO DEBE establecerse en verdadero"
contactmatt
Buena respuesta, la única pregunta que queda es cómo decidir quién debería ser el "propietario"
PandaWood
¿Qué pasa con muchos a muchos cuando tiene una tabla intermedia que contiene la relación entre 2 entidades?
Dark_Knight
10

Además de la respuesta anterior , y según tengo entendido, debe conservar el valor de la clave externa 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 obtener una explicación más detallada del atributo inverso, consulte la siguiente publicación:

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

Emad Alashi
fuente
2

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

Una forma diferente de ver esto es que en una relación de Uno a Muchos, en realidad hay 2 relaciones en curso.

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 configura la clave externa, por ejemplo, en la relación 2 cuando se almacena un hijo, automáticamente también se ha fijado la relación de un padre con el hijo porque la relación 1 es la "inversa" de la relación 2 .

Entonces, los medios inversos, 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 secundaria como inversa, NH omitirá la ejecución de sql cuando se agregue la colección secundaria.

Asumiría que si no le dijera a NH que era una inversa, entonces sería un desperdicio de esfuerzo en hacer sql para intentar establecer la relación inversa también, aunque no fuera necesario.

Mickey Puri
fuente