出于某种原因,当我尝试访问会话时,Nhibernate会出现问题。抛出以下异常:
没有配置CurrentSessionContext(设置属性current_session_context_class)!
请注意我没有使用XML来设置配置!
我在测试中打开会话:
[SetUp]
public void Initialize()
{
_session = GetSessionFactory().OpenSession();
_transaction = _session.BeginTransaction();
SetupContext();
When();
}
然后我使用Repository访问当前会话。存储库位于不同的dll中。
public void Save(Category newCategory)
{
var session = SessionFactory.GetSession();
session.SaveOrUpdate(newCategory);
}
public static ISession GetSession()
{
var session = _sessionFactory.GetCurrentSession();
if (session == null)
return _sessionFactory.OpenSession();
return session;
}
更新:
在我的BaseTest.cs课程中,我也有一个拆解:
[TearDown中] public void CleanUp() { _session.Dispose(); _transaction.Dispose(); }
在调试期间,似乎正在触发CleanUp并杀死_session对象!
另一个更新:我在构建配置时添加了以下代码:
public static ISessionFactory CreateSessionFactory()
{
_sessionFactory =
Fluently.Configure().Database(
MsSqlConfiguration.MsSql2000.ConnectionString(
c => c.FromConnectionStringWithKey("ConnectionString")))
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<Category>())
**.ExposeConfiguration(x =>
{
x.SetProperty("current_session_context_class",
"thread_static");
})**
.BuildSessionFactory();
return _sessionFactory;
}
现在我收到以下错误:
没有会话绑定到当前上下文
答案 0 :(得分:2)
您需要将会话绑定到当前上下文。
在setup
方法中:
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
在teardown
方法中:
var session = CurrentSessionContext.Unbind(SessionFactory);
session.Dispose();