2010-01-07 4 views
3

J'utilise NHibernate + Fluent pour gérer la base de données dans mon application. Jusqu'à présent, j'ai utilisé une SessionSource pour créer mes objets ISession. Je suis un peu confus à propos de ce qui vient de NHibernate ou de Fluent, et de ce que je devrais vraiment utiliser pour créer mes sessions.Courant; SessionSource ou SessionFactory pour la création de sessions?

ISession provient de NHibernate et de SessionSource de Fluent. Je crée le SessionSource à partir d'une FluentConfiguration et utilise actuellement le SessionSource pour créer des sessions. C'est ma fonction de créer des sessions. La FluentConfiguration et la SessionSource sont réutilisées:

if (_sessionSource == null) 
{ 
    _cfg = Fluently.Configure().Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("test.db")); 
    _sessionSource = new SessionSource(_cfg.BuildConfiguration().Properties, new MappingsPersistenceModel()); 
    var session = _sessionSource.CreateSession(); 
    _sessionSource.BuildSchema(session); 
    return session; 
} 
return _sessionSource.CreateSession(); 

Est-ce que cela semble raisonnable? Cela semble plus intéressant d'utiliser une ISessionFactory pour créer des sessions, alors j'ai essayé d'en utiliser une. Cela vient de NHibernate, donc je ne sais pas si c'est la raison pour laquelle c'est un problème, mais cela échoue quand mes sessions sont créées à partir d'une ISessionFactory.

// Done once: 
_sessionFactory = _cfg.BuildSessionFactory(); 

// Done each time a session is requested: 
_sessionFactory.OpenSession() 

L'utilisation de ce que j'obtenir un MappingException lors de l'utilisation de la session, en disant "Non pour persister: MyProject.Model.SomeModelClass".

Dois-je continuer à utiliser SessionSource? Ou ai-je oublié quelque chose concernant ISessionFactory?

+0

Pourriez-vous s'il vous plaît expliquer l'erreur que vous obtenez de la fabrique de session? –

+0

Dans mes propres applications, j'utilise la méthode BuildConfiguration() et la passe à une fabrique de sessions. Si vous obtenez une erreur, le message peut nous donner plus d'informations pour résoudre votre problème. –

+0

Ajout de l'exception à la description ci-dessus. Je dois courir - sera de retour un peu plus tard pour suivre .. – stiank81

Répondre

5

Le problème semble être que le SessionFactory ne connaît pas les mappages car ils sont uniquement donnés à la SessionSource. L'ajout des mappages pendant la configuration fluide et l'obtention de l'usine semblent aider. Cela m'a donné ce qui ressemble à une meilleure solution. Cela semble-t-il raisonnable à ceux d'entre vous qui ont plus d'expérience à ce sujet?

private static ISession CreateSession() 
{ 
    if (_sessionFactory == null) 
    { 
     _sessionFactory = Fluently.Configure(). 
      Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("test.db")). 
      Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()). 
      BuildSessionFactory(); 
    } 
    return _sessionFactory.OpenSession(); 
} 
+1

+1 Était sur le point d'écrire quelque chose comme ça. C'est le chemin à parcourir, bien fait. Notez que cet exemple (similaire au moins) est dans l'excellent tutoriel de FluentNH. (note: après deux jours, vous pouvez marquer votre propre réponse comme acceptée) – Abel

+0

Merci pour le commentaire et la confirmation que je suis sur la bonne voie. Vraiment apprécier l'aide que vous m'avez donné! – stiank81

2

Je sais ce que vous ressentez! La division entre fluent et NH peut être plutôt déroutante au début. À mon avis, vous ne devriez pas utiliser SessionSource, AFAIK c'est seulement vraiment utile dans les scénarios de test. Je recommande que vous utilisez simplement l'ISessionFactory directement à partir de NH.

Pouvez-vous poster votre erreur? Vous semblez l'utiliser correctement, donc il y a probablement quelque chose qui ne va pas avec la configuration ou l'objet cfg.

3

Veuillez voir que cette classe peut être complète pour vous. J'ai des méthodes d'écriture pour créer une usine et une session.

public class Common 
    { 
     public const string NHibernateSessionKey = "nhibernate.session.key"; 

     public static string ConnString 
     { 
      get 
      { 
       return System.Configuration.ConfigurationManager.ConnectionStrings["JewelSoftMySqlConn"].ConnectionString; 
      } 
     } 

     public static ISessionFactory FACTORY = CreateFactory(); 

     static ISessionFactory CreateFactory() 
     { 
      Configuration config = new Configuration(); 
      IDictionary props = new Hashtable(); 

      props.Add("hibernate.dialect", "NHibernate.Dialect.MySQLDialect"); 
      props.Add("hibernate.connection.provider", "NHibernate.Connection.DriverConnectionProvider"); 
      props.Add("hibernate.connection.driver_class", "NHibernate.Driver.MySqlDataDriver"); 
      props.Add("hibernate.connection.connection_string", Common.ConnString); 
      config.AddProperties(props); 

      config.AddInputStream(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(Resource.Models_hbm))); 

      return config.BuildSessionFactory(); 
     } 

     public static ISession GetCurrentSession() 
     { 
      ISession currentSession = null; 
      HttpContext context = HttpContext.Current; 
      if (context != null) 
      { 
       currentSession = context.Items[NHibernateSessionKey] as ISession; 
       if (currentSession == null) 
       { 
        currentSession = FACTORY.OpenSession(); 
        context.Items[NHibernateSessionKey] = currentSession; 
       } 
      } 
      else//will work non web request, like in test environment 
       currentSession = FACTORY.OpenSession(); 

      return currentSession; 
     } 
    } 
+0

Merci pour la réponse. D'après ce que je peux voir, vous n'utilisez pas Fluent ici? Seulement NHibernate? Mon problème est lié à l'utilisation de Fluent et NHibernate ensemble .. – stiank81

+0

Désolé @@ Bambuska ... et merci pour une nouvelle idée pour moi .. depuis longtemps, je veux aussi apprendre cette méthode pour utiliser Nhibernate – Pankaj

+0

Pas de problème! Découvrez le Wiki Fluent. Il est très bien écrit, et devrait être d'une bonne aide pour commencer: http://wiki.fluentnhibernate.org/Getting_started – stiank81

Questions connexes