NHibernate - 如何处理用户会话

时间:2010-07-28 20:27:05

标签: asp.net nhibernate

我想我之后的内容是一个如何做到这一点的简单示例。我有流利的nhibernate工作正常。我可以创建没有问题的新记录,并且读取现有记录没有问题。我遇到的问题是asp.net用户会话以及我如何处理我希望在页面加载之间保持这种情况的事实,我也想偶尔将它写入数据库。

我正努力工作的流程是这样的:

  • 用户登录
  • NHibernate提取用户记录
  • 用户记录填入asp.net会话
  • NHibernate会话(我认为)结束
  • app会显示“添加地址”页面的链接
  • 用户转到“添加地址”页面
  • 用户输入地址详细信息
  • 用户点击“提交”
  • 地址已添加到用户对象
  • 用户对象被写入数据库

当我尝试将用户对象(包含新地址)写回数据库时,我收到错误,告诉我用户对象已经与现有会话相关联。下面是我用来让用户退出asp.net会话的代码,添加地址并将其写回数据库。它只是在它命中的地方.SaveOrUpdate事情出错了,地址被完美地添加到了对象中。

  void AddAddress_Click(object sender, EventArgs e)
  {
   var session = Global.SessionFactory.GetCurrentSession();
   User user=(User)HttpContext.Current.Session["User"];

   user.AddAddress(txtDescription.Text, txtLine1.Text, 
     txtLine2.Text, txtTown.Text, txtCounty.Text, 
     txtPostCode.Text, txtCountry.Text);

   session.SaveOrUpdate(user);
   session.Flush();
  }

请忽略现在可能错误的101种方法,我很清楚。我只是想得到一些工作来向自己证明NHibernate是这个项目的前进方向,所以现在它会有点快速和肮脏。

3 个答案:

答案 0 :(得分:1)

NHibernate的一个常见做法是每个请求使用单个ISession。这种方法也称为“视图中的开放会话”或“OSIV”。请参阅thisthis

答案 1 :(得分:1)

在asp.net应用程序中使用NHibernate时,我发现以下两条规则确实有助于我摆脱各种陷阱。

1)每个请求只使用一个NHibernate会话。永远不要在请求之间共享会话,并避免在单个请求中打开多个。

2)不要在http会话上下文中存储任何NHibernate实体。虽然NHibernate支持“detatched”实体,但这样做会增加代码的复杂性和混乱。通过仅存储原始数据,id和属性值来保持简单。

答案 2 :(得分:0)

感谢Felix,我想我现在已经有了这个。对不起原来的问题很难理解,但看起来菲利克斯得到了我的意思。由于一些奇怪的原因,我一直无法编辑这个问题,因为我发布了它,但今晚我还有另一个问题。正如你可能知道的那样,我在没有创建帐户的情况下问了这个问题,现在我创建了一个帐户,但是存在某种不匹配。我打算今晚尝试解决这个问题,并给予应有的信用。