【问题标题】:Nhibernate Multidatabase Connection休眠多数据库连接
【发布时间】:2013-08-08 09:06:18
【问题描述】:

我们感谢任何有以下问题的人。

我们正在使用 MVC4 和 NHibernate 开发一个应用程序。

应用程序必须处理多数据库连接。

每个客户端都有自己的数据库,因此有一个连接到数据库客户端的初始登录表单,一旦检查了凭据,我们必须建立与特定客户端数据库的连接。

我们已经解决这个问题好几天了,这是我们目前正在解决的解决方案:

我们在 global.asax 上创建了一个带有 SessionFactory Dictionary 的属性。 每次客户端登录时,我们都会向 Dictionary 添加一个新的 SessionFactory。

我们创建了一个 ActionFilter 来控制 nhibernate 会话的绑定和取消绑定的每个操作,如下所示:

  public class SessionPerRequest : ActionFilterAttribute   {

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Boreas.Subsistemas.Cliente.VO.Nuestro_ClienteVO cliente = (Boreas.Subsistemas.Cliente.VO.Nuestro_ClienteVO)filterContext.HttpContext.Session["Cliente"];

        NHibernate.ISession session = MvcApplication.getSession(cliente).OpenSession();

        session.BeginTransaction();

        CurrentSessionContext.Bind(session);
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        Boreas.Subsistemas.Cliente.VO.Nuestro_ClienteVO cliente = (Boreas.Subsistemas.Cliente.VO.Nuestro_ClienteVO)filterContext.HttpContext.Session["Cliente"];

        NHibernate.ISession session = CurrentSessionContext.Unbind(MvcApplication.getSession(cliente));

        if (session != null)
        {
            if (session.Transaction.IsActive)
            {
                try
                {
                    session.Transaction.Commit();
                }
                catch
                {
                    session.Transaction.Rollback();
                }
            }

            session.Close();
        }

        MvcApplication.removeSession(cliente);
    }
}

这些是 global.asax 上创建、删除会话工厂并将其返回给每个客户端的方法:

public static void addSession(Boreas.Subsistemas.Cliente.VO.Nuestro_ClienteVO cliente)
    {
        if (!DictionarySessionFactory.ContainsKey(cliente))
        {
            ISessionFactory Session;
            var nhibernateConiguration = new NHibernate.Cfg.Configuration();
            nhibernateConiguration.SetProperty("connection.connection_string",    cliente.baseDatosClienteBoreas);

            nhibernateConiguration.Configure();
            SessionFactory = nhibernateConiguration.BuildSessionFactory();           
        }          
    }

    public static void removeSession(Boreas.Subsistemas.Cliente.VO.Nuestro_ClienteVO cliente)
    {
        if (cliente != null)
        {
            if (DictionarySessionFactory.ContainsKey(cliente))
            {
                DictionarySessionFactory.Remove(cliente);
            }
        }
    }

    public static ISessionFactory getSession(Boreas.Subsistemas.Cliente.VO.Nuestro_ClienteVO cliente)
    {
        ISessionFactory Session;

        if (cliente == null)
        {               
            var nhibernateConiguration = new NHibernate.Cfg.Configuration();
            nhibernateConiguration.SetProperty("connection.connection_string", "Data Source=BENITO-PC\\WINCODICE;Initial Catalog=ClientesBoreasRutas;User ID=sa;Password=2144;");

            nhibernateConiguration.Configure();
            Session = nhibernateConiguration.BuildSessionFactory();
            //DictionarySessionFactory.Add(null, Session);
            return Session;
        }
        else {
            if (DictionarySessionFactory.ContainsKey(cliente))
            {
                return DictionarySessionFactory[cliente];
            }
            else
            {
                var nhibernateConiguration = new NHibernate.Cfg.Configuration();
                nhibernateConiguration.SetProperty("connection.connection_string", cliente.baseDatosClienteBoreas);
                nhibernateConiguration.Configure();
                Session = nhibernateConiguration.BuildSessionFactory();
                DictionarySessionFactory.Add(cliente, Session);
                return SessionFactory;               
            }

        }               

    }

问题是应用程序返回一个 Nhibernate.HibernateException "No session bound to the current context"

我们将不胜感激任何解决问题的帮助,也很乐意倾听任何其他使用 Nhibernate 和 mvc4 实现多数据库连接的正确方法。

非常感谢您阅读我的帖子

【问题讨论】:

    标签: c# .net database nhibernate asp.net-mvc-4


    【解决方案1】:

    在您的 OnResultExecuted 方法中没有这一行:

    NHibernate.ISession session = CurrentSessionContext.Unbind(MvcApplication.getSession(cliente));
    

    在提交之前从当前上下文中取消绑定事务?完成会话后,应该会出现此行。

    在提交事务之前,您应该检索会话(通过在 SessionFactory 上调用 GetCurrentSession())提交事务,然后解除绑定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-05
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      相关资源
      最近更新 更多