7
votes

Nibernate fluide Get ID d'objet enregistré

J'utilise fluent NHibernate dans une application ASP.NET MVC. Je l'ai mis en place pour démarrer une session et une transaction sur chaque demande et commettre la transaction à la demande de la demande. Cependant, ce que je veux faire est d'enregistrer un objet (dans ce cas, une nouvelle "société"), puis redirige à la page de détail de cette nouvelle entreprise. Comment puis-je obtenir l'identifiant de la nouvelle société pour que je puisse rediriger? Si je reçois l'identifiant après la session.save (société), c'est NULL. Cela a du sens car il n'a pas encore été engagé, cependant, il semble toujours qu'il devrait y avoir un moyen relativement facile de le faire sans commettre la transaction actuelle et en entamant une nouvelle.


3 commentaires

Vous devriez pouvoir obtenir l'identifiant après avoir appelé Session.Save. Quel type d'identifiant utilisez-vous?


Quelle est l'instruction ou le code que vous utilisez pour obtenir la nouvelle valeur d'identification de ligne? Je sauve des lignes dans une table avec un champ d'identité, mais juste commencer par NHibernate. Salutations


C'est juste objet.Id ou quel que soit votre champ d'identification.


5 Réponses :


0
votes

Peut-être qu'il n'est pas défini comme autogène dans la base de données? Comme Mattias Jakobsson a dit, ID devrait être réglé après la session.Save


0 commentaires

0
votes

Comme il s'agit d'une transaction Nhibernate Reportpone change et que l'insertion n'est donc pas envoyée à la base de données - et aucun identifiant n'est généré par la base de données. DO SESSION.FLUSH () - Cela n'arrêtera pas la transaction, mais vos modifications (insérer) seront exécutées. Ou utiliser des identifiants assignés. Ou ne démarrez pas toujours les transactions - faites-le explicitement (comme pour l'exemple de # ARP Architecture avec [Transaction] Attribut).


0 commentaires

0
votes

Je pense que c'est une mauvaise idée de démarrer une transaction pour chaque session. J'utilise la session par demande et je commence et commettre une transaction dans Session_ENDREQUEST. Cependant, j'ai généralement une transaction sur la page afin que je puisse gérer toutes les erreurs qui se produisent là-bas - au fil du temps, il est trop tard pour faire quoi que ce soit, mais présenter un message d'erreur générique.

Si vous utilisez des identifiants générés par la base de données (identité), vous devrez rincer la session afin de générer l'ID.


2 commentaires

Vous devez utiliser une transaction pour chaque session, même se lit. Sinon, vous n'utiliserez pas complètement le cache - voir: ayende.com/blog/archive/2008/12/28/...


Je suis d'accord, sauf si vous voulez dire une transaction par session. Ma réponse aurait pu être plus claire, mais je plaidais contre la durée de vie de la transaction d'égaler la durée de vie de la demande. Ce n'est pas un problème d'avoir plusieurs transactions par session.



2
votes

OK, le problème était ailleurs dans mon code. Vous pouvez obtenir l'identifiant immédiatement après avoir enregistré, même si vous n'avez pas commis la transaction ni le rinçage.

Merci à tous pour les réponses, mais malheureusement, aucun d'entre eux n'est tout à fait correct.


0 commentaires

8
votes

NHibernate génère un identifiant lorsque Session.Save () ou Session.SaveorUpdate () est appelé avec une entité transitoire. À ce stade, la propriété ID de l'entité est définie et peut être utilisée.

Si le générateur d'identification nécessite un accès à la base de données, cela se produira à ce moment-là. Donc, pour le générateur d'identité, l'insert sera effectué à ce stade, de même que tout insertion en attente.

Sinon, l'insert est en attente jusqu'à ce que la session soit rinçue qui se produira:

  • de certaines invocations de recherche () ou énumérable ()
  • de Nhibernate.itransaction.commit ()
  • de isession.flush ()

0 commentaires