2015-07-23 3 views
1

J'ai un comportement étrange de NHibernate et ADO.NET. J'utilise NHibernate comme ORM standard mais certaines opérations sont plus rapides avec ADO.NET (comme le traitement par lots ou l'appel d'une procédure stockée).Nhibernate lecture suivante après appel de procédure stockée

Je fais ce qui suit

var item = _items.GetById(100); 

Alors j'appelle une procédure stockée qui ne mettre à jour la même entité avec les instructions suivantes

var session = _sessionManager.OpenSession(); 
using (var tx = session.BeginTransaction()) 
{ 
     var item = _items.GetAll().FirstOrDefault(x => x.ItemCode == code); 

     var cmd = session.Connection.CreateCommand(); 
     session.Transaction.Enlist(cmd); 
     cmd.CommandType = CommandType.StoredProcedure; 

     SqlParameter id = SQLUtil.GetParam("@bigId", SqlDbType.BigInt, inout: false); 

     cmd.CommandText = "storedUpdateItem"; 
     cmd.Parameters.Add(SQLUtil.GetParam("@tstTS", SqlDbType.Timestamp, inout: false)); 
     cmd.Parameters.Add(id); 

     int ret = cmd.ExecuteNonQuery(); 
     if (ret != 1) 
     { 
      throw new ApplicationException("Something gone wrong with update"); 
     } 
     tx.Commit(); 

     return _items.GetById(id.Value); 
} 

Ainsi, la dernière opération pour récupérer à nouveau à l'aide un référentiel NHibernate définit l'élément. Le problème est que l'élément n'est pas mis à jour avec la base de données. Cela semble être la version précédente. Une idée?

Répondre

0

Vous pouvez forcer NHibernate pour actualiser la version mise en cache de item en utilisant la méthode Refresh de l'objet session:

 ... 
     var item = _items.GetById(id.Value); 
     session.Refresh(item); 
     return item; 
}