如何在NHibernate中实现View模式中的Open Session?

时间:2010-03-26 18:05:54

标签: asp.net-mvc nhibernate design-patterns fluent-nhibernate

我正在使用ASP.NET MVC + NHibernate + Fluent NHibernate并且在延迟加载方面存在问题。

通过这个问题( How to fix a NHibernate lazy loading error "no session or session was closed"? ),我发现我必须在View模式中实现Open Session,但我不知道如何。

在我的存储库类中,我使用像这样的方法

    public ImageGallery GetById(int id) {
        using(ISession session = NHibernateSessionFactory.OpenSession()) {
            return session.Get<ImageGallery>(id);
        }
    }

    public void Add(ImageGallery imageGallery) {
        using(ISession session = NHibernateSessionFactory.OpenSession()) {
            using(ITransaction transaction = session.BeginTransaction()) {
                session.Save(imageGallery);
                transaction.Commit();
            }
        }
    }

这是我的Session Factory助手类:

public class NHibernateSessionFactory {
    private static ISessionFactory _sessionFactory;
    private static ISessionFactory SessionFactory {
        get {
            if(_sessionFactory == null) {
                _sessionFactory = Fluently.Configure()
                    .Database(MySQLConfiguration.Standard.ConnectionString(MyConnString))
                    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ImageGalleryMap>())
                    .ExposeConfiguration(c => c.Properties.Add("hbm2ddl.keywords", "none"))
                    .BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }
    public static ISession OpenSession() {
        return SessionFactory.OpenSession();
    }
}

有人可以帮我在View模式中实现Open Session吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

之前已经问过,但我不记得在哪里找到它。当您执行以下操作或类似操作时,您拥有所需的内容,并且某些代码重复会在您的存储库中减少为奖励。

public class Repository
{
  private readonly ISession session;

  public Repository()
  {
    session = CurrentSessionContext.CurrentSession();
  } 

  public ImageGallery GetById(int id) 
  {
    return session.Get<ImageGallery>(id);
  }

  public void Add(ImageGallery imageGallery)
  {
    session.Save(imageGallery);
  }
}

您还可以使用ioc容器和工作包装单元而不是当前会话上下文来管理会话。