2009-08-17 7 views
3

BONJOUR,NHibernate 'sauver' - problème> 'get'

J'utilise NHibernate et ont des problèmes en ce qui concerne l'enregistrement des utilisateurs sur mon site.

Lorsque l'utilisateur veut-je enregistrer créer un nouveau record utilisateur dans la base de données et immidiatelly après que le système se connecte l'utilisateur.

est bien là le problème ... Lors de la création d'enregistrement utilisateur J'utilise

NHibernateSession.Save (entité); // ne sauvegarde pas l'objet utilisateur immédiatement dans la base de données. C'est gardé dans la session.

Et quand je veux connecter l'utilisateur, je charge l'utilisateur par son nom d'utilisateur, puis j'obtiens un objet utilisateur nul. Pourquoi ai-je un objet nul et comment puis-je le faire fonctionner?

Merci

Répondre

1

Si votre Enregistrer et obtenir sont fait à partir de différentes sessions alors le Get renvoie null parce que l'objet existe que dans les autres sessions cache interne jusqu'à ce qu'il soit rincée. Je ne suis pas sûr si un cache L2 ferait une différence (je ne sais pas si le cache L2 est écrit à Save ou Flush).

+0

Je suis passé en mode débogage et j'ai vérifié les identifiants de session (sur save et get) et ils sont identiques. – Goran

+0

impair ... aurait à faire quelques tests pour voir ce qui a du sens. – anonymous

3

Ok, je viens de tester ceci:

 ISession session = s.CreateSession(); 

     User user = new User(); 

     user.Number = 122; 
     user.UserName = "u"; 
     user.Id = 1; 

     session.Save(user); 
     User user1 = session.CreateCriteria<User>().Add(Restrictions.Eq("UserName", "u")).UniqueResult<User>(); 

     session.Flush(); 

D'abord le Select est en cours d'exécution de la createCriteria puis sur affleurant l'insert. Voilà pourquoi il ne trouve rien.

J'ai également testé avec Get<User>(1) et il renvoie l'entité passée à la méthode Save - aucune requête n'est exécutée.

Toujours - pourquoi interroger la base de données puisque vous avez l'entité juste là?

En outre, vous dites que vous utilisez Get, puis dites que vous voulez charger par UserName - le nom d'utilisateur est-il la clé primaire? Obtenez essaie de charger par la clé primaire.

+1

A partir du blog Ayende (http://ayende.com/Blog/archive/2009/04/30/nhibernate-ndash-the-difference-between-get-load-and-querying-by.aspx): résultat dans un select contre la base de données, mais il va d'abord vérifier le cache de session et le cache de deuxième niveau pour obtenir les valeurs en premier. " Je prends ceci pour signifier que si vous avez un Save() et Get() juste après l'autre pour la même entité, il ne devrait pas frapper la DB, mais je n'ai pas encore pris le temps de tester. – anonymous

+0

hmm .. vous pourriez avoir raison - mais je ne comprends toujours pas pourquoi appeler obtenir quand vous avez l'entité juste là. – sirrocco

+0

Yah, je pense que plus d'informations sont nécessaires. – anonymous