2009-04-03 12 views
82

¿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.Atributo inverso en NHibernate

¿Alguien puede arrojar algunas luces sobre esto?

+2

También puede verificar mi respuesta, "[Cuándo utilizar inverse =" true | false "] (http://stackoverflow.com/a/6951546/221708)", en una pregunta similar. –

Respuesta

114

El atributo inversa no se debe establecer en realidad ...

se utiliza el atributo inversa para especificar el 'dueño' 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, a continuación, NHibernate llevará a cabo 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 la clave externa se establezca y el la asociación está hecha. (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á la entidad que 'posee' la colección, y persistirá las entidades que están en la colección después, evitando una instrucción UPDATE adicional.

Por lo tanto, en una asociación bidireccional, siempre tiene un extremo inverso.

+4

Esto explica todo, solo para agregar el propietario es uno que tiene la clave externa en la tabla –

+3

http://tadtech.blogspot.com/2007/02/hibernate-when-is-inversetrue-and-when.html –

+42

En mi opinión, esto es muy mala terminología. ¿Por qué no marcar la propiedad en lugar de la 'inversa'? – UpTheCreek

8

Además de the answer above, y de acuerdo a mi entender, es necesario para conservar el valor de clave externa en la colección de forma manual, es decir, si no desea que 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 su posterior explicación del atributo inversa, compruebe lo siguiente mensaje:

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

2

puedo ver que el "dueño" entra, sino una asociación es una pipa, y se puede mirar hacia abajo cada extremo, lo cuál está a sa y 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 dos relaciones en curso.

Relación 1: padres con muchos hijos.

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

Así NH intentará ejecutar SQL para almacenar cada uno de éstos en el PP. Pero no es necesario porque cuando configura la clave externa, p. en la relación 2 cuando un niño está almacenado, entonces también 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.

Lo inverso significa que es algo que obtenemos predeterminado una vez que hemos establecido 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.

Supongo que si no le dijiste a NH que era inverso, desperdiciarías esfuerzo en hacer sql para intentar establecer la relación inversa también, aunque no fue necesario.