2010-07-28 51 views
0

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

我试图让工作流程是这样的:

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

当我尝试写用户对象(完整的新地址)回到数据库,我得到一个错误,告诉我用户对象已经与现有会话相关联。下面是我用来让用户退出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是这个项目的前进方向,所以它现在会变得有点快速和肮脏。

+0

如果您花费更多时间解释您所做的事,并且不理解NHibernate会话生命周期如何在Web应用程序中工作,将会有所帮助。我不清楚为什么你认为上面的代码应该工作? – 2010-07-29 10:47:57

回答

1

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

1

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

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

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

0

感谢Felix,我想我现在得到了这个。对不起,原来的问题很难理解,但Felix看起来像我的意思。出于某种奇怪的原因,自从我发布这个问题以来,我一直无法编辑这个问题,但今晚我还会再去一次。正如你可能知道的那样,我没有先创建一个帐户就问了这个问题,而现在我创建了一个帐户,出现了某种不匹配。我将尽力解决今晚的问题,并在可能的情况下给予奖励。