1 votes

confus pourquoi les modifications de mes entités sont-elles reflétées sans être validées ?

J'utilise nhiberate, avec le modèle de dépôt.

Par exemple, MakePersistance ressemble à ce qui suit :

 public T MakePersistent(T entity)
        {
            Session.Save(entity);

            return entity;
        }

Dans un module httpm, la requête de départ :

ISession session = NHibernateHelper.OpenSession();
 session.BeginTransaction();

 CurrentSessionContext.Bind(session);

Demande de fin :

ISession session = CurrentSessionContext.Unbind(
            NHibernateHelper.SessionFactory);

            if (session != null)
                try
                {
                    session.Transaction.Commit();
                }
                catch (Exception ex)
                {
                    session.Transaction.Rollback();
                    //Server.Transfer("...", true);
                }
                finally
                {
                    session.Close();
                }

Ainsi, à chaque demande de page, la transaction commence et se termine.

D'après ce que j'ai compris, cela signifie que si je mets à jour une entité et que j'interroge cette entité après la mise à jour, la requête renverra l'état original de l'entité puisque la mise à jour n'a pas été validée dans la base de données.

Mais j'ai testé (et vu dans sql profiler) que la base de données effectue la mise à jour et qu'ensuite la récupération de la même entité est fraîche/à jour.

C'est ce que j'ai fait :

Entity e = EntityDao.GetById(1);

// e.count outputs 0

e.Count += 1;

// e.count outputs 1 as expected

EntityDao.MakePersistant(entity);

entity = EntityDao.GetById(1);  // getting from the db again

// e.count ouputs 1  ***

La valeur ne devrait-elle pas être de 0 puisque la base de données est périmée jusqu'à ce que la requête se termine et qu'elle soit enregistrée dans la base de données ?

1voto

tolism7 Points 1857

Si la clé primaire de votre entité est la colonne identy, c'est un comportement normal, car NHibernate DOIT persister les données dans la base de données afin d'obtenir l'ID de l'entité pour pouvoir la placer dans sa session. C'est le cas avec tous les générateurs d'insertion a posteriori. Si vous ne voulez pas que cela se produise et si vous voulez bénéficier de nombreux autres avantages, vous devriez choisir d'utiliser l'un des générateurs de style ORM comme le générateur HiLo/Sequence HiLo.

Pour plus d'informations, consultez le site suivant :

http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx

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