尝试加载页面时,我没有收到“没有绑定到当前上下文的会话”错误(mvc 3)。
public static ISessionFactory BuildSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008 //
.ConnectionString(@"Server=.\SQLExpress;Database=db1;Uid=dev;Pwd=123;")
.ShowSql())
//.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
//.CurrentSessionContext<CallSessionContext>()
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<User>())
.ExposeConfiguration(cfg => new SchemaExport(cfg)
.Create(false, false))
.BuildSessionFactory();
}
实际错误发生在我的Repository.cs文件中:
第114行:public virtual T Get(int id) 第115行:{ 第116行:return _sessionFactory.GetCurrentSession()。Get(id); 第117行:} 第118行:
当我调试它时,_sessionFactory不是null或任何东西,它似乎无法找到绑定的会话。
我在我的web.config中连接了httpmodule,它确实运行了,这不是问题。
在我的nhibernate配置中,我尝试了两种方法:
.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
和
.CurrentSessionContext<CallSessionContext>()
但那没用。
答案 0 :(得分:9)
听起来您没有将会话绑定到上下文。请看下面的例子:
public class SessionFactory
{
protected static ISessionFactory sessionFactory;
private static ILog log = LogManager.GetLogger(typeof(SessionFactory));
//Several functions omitted for brevity
public static ISession GetCurrentSession()
{
if(!CurrentSessionContext.HasBind(GetSessionFactory()))
CurrentSessionContext.Bind(GetSessionFactory().OpenSession());
return GetSessionFactory().GetCurrentSession();
}
public static void DisposeCurrentSession()
{
ISession currentSession = CurrentSessionContext.Unbind(GetSessionFactory());
currentSession.Close();
currentSession.Dispose();
}
}
上述的关键是每当您检索第一个会话时,都会将其绑定到您正在使用的任何上下文。