我目前有一个NHibernateHelper类,用于创建会话工厂。我一直在收到“会话结束!”的错误。我是以错误的方式解决这个问题吗?当我调用Add(用户用户)
之后调用的Add(登录登录)时,会发生错误public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure();
configuration.AddAssembly("System.Core");
_sessionFactory = configuration.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
这是我的存储库:
internal class UserRepository : IUserRepository
{
private ISession _db = NHibernateHelper.OpenSession();
public void Add(User user)
{
using (_db)
{
using (ITransaction transaction = _db.BeginTransaction())
{
IEnumerable<UserRole> userRoles = user.UserRoles;
user.UserRoles = null;
_db.Save(user);
foreach (UserRole userRole in userRoles)
{
userRole.UserID = user.UserID;
_db.Save(userRole);
}
transaction.Commit();
}
}
}
public void Add(Login login)
{
using (_db)
{
using (ITransaction transaction = _db.BeginTransaction())
{
_db.Save(login);
transaction.Commit();
}
}
}
}
答案 0 :(得分:2)
这是因为您正在使用(_db)调用,它会在块结束时关闭会话。
而不是让变量_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问题的链接,该问题显示了如何使工厂帮助程序线程安全: