与其使用变量\u db,不如为每个操作调用OpenSession
public void Add(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
IEnumerable<UserRole> userRoles = user.UserRoles;
user.UserRoles = null;
session.Save(user);
foreach (UserRole userRole in userRoles)
{
userRole.UserID = user.UserID;
session.Save(userRole);
}
transaction.Commit();
}
}
}
public void Add(Login login)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Add(login, session);
}
}
public void Add(Login login, ISession session)
{
//no longer need to create a session here - it is passed in
//using (ISession session = NHibernateHelper.OpenSession())
...Add using the session
}
工厂的创建是昂贵的,所以你的助手是一个好东西。打开会话是一个廉价的操作,因此不需要像这样的共享会话。
下面是指向另一个SO问题的链接,该问题显示如何使factory helper线程安全:
Ensure NHibernate SessionFactory is only created once