流利; SessionSource或SessionFactory用于创建会话?

时间:2010-01-07 10:12:05

标签: c# .net nhibernate session fluent-nhibernate

我正在使用NHibernate + Fluent来处理我的应用程序中的数据库。到目前为止,我一直在使用SessionSource来创建我的ISession对象。我现在对NHibernate或Fluent的内容感到有点困惑,以及我真正应该用来创建会话的内容。

ISession来自NHibernate,来自Fluent的SessionSource。我从FluentConfiguration创建SessionSource,并且当前使用SessionSource来创建会话。这是我创建会话的功能。重用FluentConfiguration和SessionSource:

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(); 

这看起来合理吗?使用ISessionFactory创建会话听起来更有吸引力,所以我尝试使用一个。这来自NHibernate,所以我不知道这是不是问题,但是当我的会话是从ISessionFactory创建的时候它会失败。

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

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

使用这个我在使用会话时得到MappingException,说“ No persister for:MyProject.Model.SomeModelClass ”。

我应该继续使用SessionSource吗?或者我错过了有关ISessionFactory的内容?

3 个答案:

答案 0 :(得分:5)

问题似乎是SessionFactory不知道映射,因为它们只被提供给SessionSource。在流畅的配置中添加映​​射并从中获取工厂似乎有所帮助。这给了我看起来更好的解决方案。对于那些对此有更多经验的人来说,这看起来合情合理吗?

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 :(得分:3)

请参阅此课程可能对您有所帮助。我已经为创建工厂和会话编写了方法。

 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;
        }
    }

答案 2 :(得分:2)

我知道你的感受!流利与NH之间的分歧在开始时可能相当混乱。在我看来,你不应该使用SessionSource,AFAIK它只对测试场景非常有用。我建议你直接从NH使用ISessionFactory。

你能发布你的错误吗?您似乎正确使用它,因此配置或cfg对象可能有问题。