关于Nhibernate在wpf中的使用:Session.Save()无法保存数据到数据库中

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Burongwawa520/article/details/8518894

最近想使用Nhibernate作为数据持久层应用到wpf项目中,但是所有的都配置好了,单元测试了,保存没有问题!但是一查看数据库中,却发现数据并未有插入的数据。这是怎么回事呢?在网上查了有以下几种说法:

1、没有提交事务。这个我尝试了,没有成功!

2、没有使用Session.Flush()。这个我也尝试,还是没有成功!

3、没有使用Session.Close()。这个我也尝试,还是没有成功!

最后,无奈没有办法了。在网上也没有找到一个能说出所以然的答案来的。所以,最后将获得ISession的方法从SessionFactory.OpenSession()改为SessionFactory.GetCurrentSession()。单元测试提示空指针了,网上说查到说要设置一个current_session_context_class的属性,值我设的是NHibernate.Context.ThreadStaticSessionContext,最后还是没有成功!哎!无语了,真是纠结啊,到现在这个问题还是么有解决!

 

研究了一个晚上,终于把数据保存不到数据库中的这个问题解决了。具体的做法是在App.cs文件中的Startup事件和Exit事件中加上如下代码:

以下代码用于Startup事件中:

         /// <summary>
        /// 定义应用程序启动时要处理的内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            //通过配置获得SessionFactory
            initializeNHibernateForAppWPF();
            ISession session = SessionFactory.OpenSession();
            session.BeginTransaction();
            CurrentSessionContext.Bind(session);
        }

 

#region  NHibernate

        public static ISessionFactory SessionFactory;

        private static void initializeNHibernateForAppWPF()
        {
            Configuration cfg = new Configuration().Configure();
            cfg.AddAssembly(typeof (AbstractSession).Assembly);
            cfg.AddProperties(new Dictionary<string, string>
                                  {
                                     {"current_session_context_class","NHibernate.Context.ThreadStaticSessionContext"}
                                  });
            try
            {
                SessionFactory = cfg.BuildSessionFactory();
               
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
        }

        #endregion

 

        /// <summary>
        /// 定义应用程序在退出时要处理的内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Application_Exit(object sender, ExitEventArgs e)
        {
            ISession session = CurrentSessionContext.Unbind(SessionFactory);
            if(session.Transaction!=null)
            {
                session.Transaction.Commit();
                session.Transaction.Dispose();
            }
        }

展开阅读全文

没有更多推荐了,返回首页