2010-07-28 41 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看起來像我的意思。出於某種奇怪的原因,自從我發佈這個問題以來,我一直無法編輯這個問題,但今晚我還會再去一次。正如你可能知道的那樣,我沒有先創建一個帳戶就問了這個問題,而現在我創建了一個帳戶,出現了某種不匹配。我將盡力解決今晚的問題,並在可能的情況下給予獎勵。