89 votes

Attribut Inverse dans NHibernate

Comment puis-je utiliser l'Attribut Inverse? Si je ne me trompe pas, pour l'un de beaucoup de relations à l'inverse de l'attribut doit être défini à true. Pour plusieurs-à-plusieurs liens, l'un de la classe d'entité inverse des attributs doit être défini à true, et un autre défini à false.

N'importe qui peut jeter quelques lumières sur ce point?

123voto

Frederik Gheysels Points 36354

L'attribut inverse ne doit pas être défini à true ...

Vous utilisez l'attribut inverse pour spécifier le "propriétaire" de l'association. (Une association peut avoir qu'un seul propriétaire, donc une extrémité doit être fixée à l'inverse, l'autre doit être réglé à "non inverse"). (Propriétaire: inverse=false; Non-propriétaire: inverse=true)

Dans un un-à-plusieurs association, si vous n'avez pas la marque de la collection comme l'inverse de la fin, alors NHibernate permettra d'effectuer une mise à JOUR supplémentaire. En fait, dans ce cas, NHibernate sera d'abord insérer l'entité qui est contenue dans la collection, si nécessaire, insérer l'entité qui possède la collection, et par la suite, les mises à jour de la collection de l'entité", de sorte que la clé étrangère est ensemble et l'association est faite. (Notez que cela signifie aussi que la clé étrangère dans votre base de données doit être nullable).

Lorsque vous marquez la fin de collection comme "inverse", puis NHibernate sera d'abord de préserver l'entité qui "possède" la collection, et de persister les entités qui sont dans la collection par la suite, en évitant une mise à JOUR supplémentaire de déclaration.

Ainsi, dans une bi-directionnel de l'association, vous avez toujours un inverse à la fin.

10voto

Emad Alashi Points 313

En plus de la réponse ci-dessus, et selon ma compréhension, vous devez persister la valeur de clé étrangère dans la collection manuellement, c'est si vous ne voulez pas que les extra instruction de mise à jour:

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);

pour de plus amples explication de l'attribut inverse, vérifier le post suivant:

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

2voto

Mickey Puri Points 184

Je peux voir où le "propriétaire", mais une association est une pipe, et vous pouvez regarder vers le bas à chaque extrémité, ainsi quel est-à-dire l'entité qui est "propriétaire" de la pipe.

Une autre façon de voir cela est, que dans une seule de Nombreuses relations, il y a en fait 2 relations.

Relation 1: Parent de Nombreux Enfants.

Relation 2: Chaque Enfant à ses Parents

Donc NH tentera d'exécuter sql pour stocker chacune de ces dans la DB. Mais il n'en a pas besoin, car lorsque vous définissez la Clé Étrangère par exemple, dans la Relation 2 lorsqu'un enfant est stocké, puis il a automatiquement fixe de la relation d'une mère à l'enfant en tant que bien, parce que la Relation 1 est "l'Inverse" de la Relation 2.

Donc inverse de moyens, c'est quelque chose que nous obtenons par défaut une fois que nous avons établi les relations principales. c'est à dire il n'est pas nécessaire pour NH pour exécuter sql afin de corriger les Relations 1 et par le marquage de la collection d'enfants qu'une inversion de NH ignorer l'exécution de sql lorsque les enfants de la collection est ajouté.

Je suppose que si vous n'avez pas dire NH c'était l'inverse, il serait un gaspillage de ressources en faisant sql pour essayer et mettre en place la relation inverse ainsi - même si elle n'en avait pas besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X