C# ASP MVC4和x2B;会话中的NHibernate对象
我需要将hibernate对象保存到会话中,然后检索它的一个外键属性,如下所示:C# ASP MVC4和x2B;会话中的NHibernate对象,c#,asp.net-mvc,asp.net-mvc-4,session,nhibernate,C#,Asp.net Mvc,Asp.net Mvc 4,Session,Nhibernate,我需要将hibernate对象保存到会话中,然后检索它的一个外键属性,如下所示: public ActionResult Login(LoginModel model, string returnUrl) { User usr = _userRepository.GetById(Convert.ToInt32(ModelState["User"].Value.AttemptedValue)); Session["user"] = usr; } public ActionRes
public ActionResult Login(LoginModel model, string returnUrl) {
User usr = _userRepository.GetById(Convert.ToInt32(ModelState["User"].Value.AttemptedValue));
Session["user"] = usr;
}
public ActionResult Index() {
Customer customerActive = Session["user"].Customer.Active;
// this line throws an error:
// Initializing[Myproj.Models.Customer#3]-Could not initialize proxy - no Session.
}
由于User.Customer是一个外键,NHIbernate延迟加载它,因此调用失败。如何防止这种“无会话”故障?如果要继续使用现有方法,您需要确保在将客户放入会话之前对其进行初始化,例如:
var userId = Convert.ToInt32(ModelState["User"].Value.AttemptedValue);
User usr = _userRepository.GetById(userId);
NHibernateUtil.Initialize(usr.Customer);
Session["user"] = usr;
但是
正如评论员所暗示的,可能有各种更好的方法,因为会话不是存储大型复杂对象的好地方,如果您在web场中,这些对象必须序列化并远程存储
如果每次传递用户ID并从数据库加载对您的性能有影响,那么您可以做几件事,例如:
- 您可以在数据库调用前面放置一些缓存
- 将一些基本用户数据存储在cookie(或本地存储)中,以保存任何数据库命中 -