C# ASP MVC4和x2B;会话中的NHibernate对象

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

我需要将hibernate对象保存到会话中,然后检索它的一个外键属性,如下所示:

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(或本地存储)中,以保存任何数据库命中 -

例如,请尝试以下读数:。MVC和NHibernate意味着,根据请求引入会话。开始时打开,结束时关闭。所有延迟加载的功能都可以访问会话。。。没有什么奇怪的…这不会起作用,因为在这种情况下,事务只在每个请求结束时提交,这意味着只能显示一般错误页面,而不是特定的错误页面。您应该充分利用MVC的功能。对写入操作使用一个请求。。。另一个用于显示(成功或错误)。这可以很容易地做到重定向到。。。两个控制器/操作都有自己的完整会话访问权限