【发布时间】:2016-01-26 02:18:27
【问题描述】:
我在 ASP.NET WebForms 应用程序上使用 NHibernate 时遇到了一些问题。
我可以做所有事情 - 保存、获取、删除、更新寄存器,但是当我尝试使用惰性集合获取一些对象时,会引发异常:
会话已关闭
我什么都试过了。有人可以帮忙吗?
存储库类
private ISession m_session = NHibernateHelper.OpenSession();
protected ISession Session
{
get
{
return m_session;
}
}
public virtual void Update(T entity)
{
using (ITransaction transaction = Session.BeginTransaction())
{
Session.Merge(entity);
transaction.Commit();
}
}
public virtual int Count()
{
return (from t in Session.Query<T>()
select t).Count();
}
public virtual void Remove(T entity)
{
using (ISession session = NHibernateHelper.OpenSession())
try
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(entity);
transaction.Commit();
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
public virtual void Remove(int id)
{
using (ISession session = NHibernateHelper.OpenSession())
try
{
T entity = session.Get<T>(id);
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(entity);
transaction.Commit();
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
public virtual IList<T> ListAll()
{
return (from t in Session.Query<T>()
select t).ToList();
}
public virtual T Get(Type entityType, object id)
{
return (T)Session.Get(entityType, id);
}
public virtual T Get(object id)
{
return Session.Get<T>(id);
}
public virtual void Save(T entity)
{
using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(entity);
transaction.Commit();
}
}
NHibernateHelper
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory = null;
private static ISessionFactory GetSessionFactory()
{
return CreateSessionFactory();
}
private static Object createLock = new Object();
private static ISessionFactory CreateSessionFactory()
{
lock (createLock)
{
if (_sessionFactory == null)
{
Configuration config = new Configuration().Configure(System.Reflection.Assembly.GetExecutingAssembly(), "Repositorio.hibernate.cfg.xml");
_sessionFactory = config.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return GetSessionFactory().OpenSession();
}
}
【问题讨论】:
-
答案是正确的,但答案提供的解决方案不是一个好方法。您需要一个 Open Session In View 模式。你可以搜索并找到很多关于它的东西。
标签: c# asp.net nhibernate lazy-loading