我需要将一个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延迟加载它,因此调用失败。我怎么能阻止这种“无会话”失败?
答案 0 :(得分:1)
如果您想继续使用现有方法,您可以确保在将客户放入会话之前对其进行初始化,例如
var userId = Convert.ToInt32(ModelState["User"].Value.AttemptedValue);
User usr = _userRepository.GetById(userId);
NHibernateUtil.Initialize(usr.Customer);
Session["user"] = usr;
但是...
正如评论员所暗示的那样,可能存在各种更好的方法,因为会话不是存储可能成为大型复杂对象的好地方,如果您在Web场中,这些对象必须被远程序列化和存储。
如果每次传递userId并从数据库加载对你来说都是性能影响,你可以做几件事,例如