我们感谢任何有以下问题的人。
我们正在使用 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 实现多数据库连接的正确方法也会很有趣。
非常感谢你阅读我的帖子