Это потому, что вы звоните с помощью (_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();
}
}
}
UPDATE:
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 вопрос, который показывает, как сделать ваш фабричный вспомогательный поток безопасным:
Убедитесь, что NHibernate SessionFactory создается только один раз