例如。我的会话工厂位于 MyDomain.SessionProvider 类中。会话可以打开using ISession session = SessionProvider.Instance.OpenSession()
步骤:SessionProvider.cs
public static SessionProvider Instance { get; private set; }
private static ISessionFactory _SessionFactory;
static SessionProvider()
{
var provider = new SessionProvider();
provider.Initialize();
Instance = provider;
}
private SessionProvider()
{
}
private void Initialize()
{
string csStringName = "ConnectionString";
var cfg = Fluently.Configure()
//ommiting mapping and db conf.
.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
.BuildConfiguration();
_SessionFactory = cfg.BuildSessionFactory();
}
public ISession OpenSession()
{
return _SessionFactory.OpenSession();
}
public ISession GetCurrentSession()
{
return _SessionFactory.GetCurrentSession();
}
步骤:Global.asax.cs
public static ISessionFactory SessionFactory { get; private set; }
申请开始
SessionFactory = SessionProvider.Instance.OpenSession().SessionFactory;
App_BeginRequest
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
EndRequest 处理会话
var session = CurrentSessionContext.Unbind(SessionFactory);
session.Dispose();
Step3.HomeController 我应该使用当前会话
var session = SessionProvider.Instance.GetCurrentSession();
using (var tran = session.BeginTransaction())
{
//retrieve data from session
}
现在,尝试在我的控制器上检索数据,例如 desc。在步骤 3。我收到错误消息,提示我的会话已关闭。我试图删除 global.asax 中的 Application_EndRequest 块,因为我的事务被会话包装但没有成功。还是一样的错误。
第二个/侧面问题:这种模式是否被广泛接受,或者最好将其包装在 mvc 控制器的自定义属性中。谢谢。
更新:在我的控制器上尝试在线实例化当前会话
var session = SessionProvider.Instance.GetCurrentSession();
我收到以下错误:
**Connection = 'session.Connection' threw an exception of type 'NHibernate.HibernateException'**
**base {System.ApplicationException} = {"Session is closed"}**