Session中的ASP MVC4 + NHibernate对象

时间:2014-03-06 07:34:37

标签: c# asp.net-mvc asp.net-mvc-4 session nhibernate

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

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延迟加载它,因此调用失败。我怎么能阻止这种“无会话”失败?

1 个答案:

答案 0 :(得分:1)

如果您想继续使用现有方法,您可以确保在将客户放入会话之前对其进行初始化,例如

var userId = Convert.ToInt32(ModelState["User"].Value.AttemptedValue);
User usr = _userRepository.GetById(userId);
NHibernateUtil.Initialize(usr.Customer);
Session["user"] = usr;

但是...

正如评论员所暗示的那样,可能存在各种更好的方法,因为会话不是存储可能成为大型复杂对象的好地方,如果您在Web场中,这些对象必须被远程序列化和存储。

如果每次传递userId并从数据库加载对你来说都是性能影响,你可以做几件事,例如

  • 您可以在数据库调用
  • 前放置一些缓存
  • 将一些基本用户数据存储在 cookie (或本地存储)中以保存任何数据库命中 -