2017-09-27 2 views
1

Dans une séance NHibernate avons-nous besoin d'invoquer Flush() avant d'exécuter une instruction HQL?Ai-je besoin explicitement Purger lors de l'utilisation de NHibernate HQL

Je crois que NHibernate devrait être assez intelligent pour Flush quand il s'agit de `HQL.

Par exemple,

 using (ISession session) 
     { 
      var query = session.CreateQuery(
        $"DELETE FROM Table WHERE id = :id") 
       .SetParameter("id", someId); 

      session.Flush(); //is this necessary? 
      query.ExecuteUpdate(); 
      session.Clear(); //is this necessary? 
     } 

Répondre

0

En ce qui concerne les données de lecture, si votre réglage FlushMode est Auto, qui est la valeur par défaut, alors NH fera tout son possible pour gérer le rinçage afin que le résultat des requêtes est conforme à ce qui est actuellement dans la session. Toutefois, lorsqu'il s'agit d'ajouter, de mettre à jour et de supprimer, il est important d'être explicite. Le code suivant est l'exemple canonique:

using (ISession session) 
using (var transaction = session.BeginTransaction()) 
{ 
    var query = session.CreateQuery(
     $"DELETE FROM Table WHERE id = :id") 
      .SetParameter("id", someId); 

    query.ExecuteUpdate(); 

    transaction.Commit(); 
} 

la transaction prend Commettre soin de la chasse pour vous tout en assurant la cohérence des bases de données.

Je dois mettre en garde cette réponse en disant que j'utilise rarement HQL, donc ma réponse pourrait manquer quelque chose qui est spécifiquement lié à HQL et à son comportement.