在Nhibernate中设置CRUD方法和SessionFactory的好方法是什么?

时间:2010-08-24 08:38:11

标签: c# nhibernate sessionfactory

我目前有一个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();
                }
            }

        }
}

1 个答案:

答案 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问题的链接,该问题显示了如何使工厂帮助程序线程安全:

Ensure NHibernate SessionFactory is only created once