我正在学习NHibernate,并且最近查看了一些在ASP.Net MVC项目中使用NHibernate的代码。
在此应用程序的某个部分中,从NH加载的实体将保留在(HttpContext)会话中。这样可以吗?如果您使用(NHibernate) Session-per-request模式,这样做会有任何危险吗?
发布于 2009-10-18 04:09:27
除非你真的知道你在做什么,否则我不建议你这么做。在我的脑海中:
存储在httpsession中的
如果你想进行跨请求对话,可以查看NHibernate.Burrow,这是一个专门为此目的而设计的框架。
发布于 2009-10-18 11:31:20
NHibernate的“每个请求的会话”与HttpSession没有关系。session per request中的session是NHibernate ISession。在请求开始时将NHibernate.ISession存储在HttpContext.Current.Items中并在请求结束时处理它是安全的。
发布于 2009-10-30 10:41:32
是的,如果你是基于一个不是主键的属性来获取一个频繁使用的对象,那么缓存它是有意义的。
我的站点有一个Person类,它表示站点上的特定用户。对于任何给定的web请求,我需要多次获取当前登录的用户对象,以访问特定于当前用户的各种配置设置和属性。我没有每次都访问数据库,而是将当前用户存储在HttpContext.Items[]中,并且我有一个静态方法来检查项目缓存是否包含当前用户。如果有,返回它,如果它没有从数据库中获得它,并将它添加到缓存中,以便下次可用:
public static Person CurrentUser
{
get
{
if(!IsAuthenticated) return null;
Person person = (Person) HttpContext.Current.Items[HttpContext.Current.User.Identity.Name];
if(person != null) return person;
IPersonDao personDao = new PersonDao();
person = personDao.getByUsernameEmail(HttpContext.Current.User.Identity.Name);
if(person==null)
{
FormsAuthentication.SignOut();
HttpContext.Current.Response.Redirect("/");
}
HttpContext.Current.Items[HttpContext.Current.User.Identity.Name] = person;
return person;
}
}我还将我的NHibernate会话对象存储在HttpContext.Items中,以便在HttpRequest结束时同时对会话和缓存对象进行垃圾回收,您不希望对象在会话的生命周期之后继续存在,否则可能会启动一个新会话,并且NHibernate将显示一个NHibernate.NonUniqueObjectException,因为该对象被绑定到另一个会话。
值得指出的是,NHibernate的一级缓存通过ID缓存会话访问的所有对象。如果我调用的是session.get( id ),就不需要缓存,因为NHibernate的一级缓存根据对象的id来维护对象。但在上面通过User.Identity.Name获取person对象的情况下,一级缓存不起作用,因为用户的用户名不是对象的主键。
有关HttpContext.Items http://aspnet.4guysfromrolla.com/articles/060904-1.aspx的更多信息
不要使用HttpContext.Cache,由于某些原因,它会持续到Http请求之后。
https://stackoverflow.com/questions/1583418
复制相似问题