代码之家  ›  专栏  ›  技术社区  ›  Andrew

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

  •  3
  • Andrew  · 技术社区  · 14 年前

    我目前有一个NHibernateHelper类,它创建了一个会话工厂。我不断收到错误,说“会话已关闭!”。我是不是走错了路?当我调用Add(Login Login)时会发生错误,Add(User)之后会调用该函数

    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 回复  |  直到 14 年前
        1
  •  2
  •   Community Reversed Engineer    7 年前

    与其使用变量\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