【问题标题】:ASP MVC4 + NHibernate objects in Session会话中的 ASP MVC4 + NHibernate 对象
【发布时间】:2014-04-08 16:56:53
【问题描述】:

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

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 延迟加载它,因此调用失败。如何防止这种“无会话”失败?

【问题讨论】:

  • 例如试试这个阅读:hackingon.net/post/…。 MVC 和 NHibernate 意味着,每个请求都引入会话。开始时打开,结束时关闭。所有延迟加载的功能都可以访问 Session...没什么好奇怪的...
  • 这不起作用,因为在这种情况下事务只在每个请求结束时提交,这意味着只能显示通用错误页面而不是特定页面。
  • 您应该使用 MVC 的全部功能。将一个请求用于写入操作……另一个用于显示(成功或错误)。这可以通过 RedirectTo 轻松完成...控制器/操作都将拥有自己的完整会话访问权限

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


【解决方案1】:

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

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

但是……

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2011-04-18
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多