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 ?