2010-02-11 98 views
5

我在Asp.net MVC應用程序中使用流利NHibernate。我已經設置好每個請求都啓動會話和事務,並在請求結束時提交事務。但是,我想要做的是保存一個對象(在本例中是一個新的「公司」),然後重定向到新公司的詳細信息頁面。我如何獲得新公司的ID以便我可以重定向?如果我在session.Save(公司)後獲得Id,則它爲空。這是有道理的,因爲它尚未提交,但是,似乎應該有一種相對簡單的方法來做到這一點,而無需提交當前事務並開始新事務。Fluent NHibernate獲取保存對象的ID

+1

你應該可以在你調用session.save之後得到id。你使用什麼id類型? – 2010-02-11 07:18:25

+0

用於獲取新行ID值的指令或代碼是什麼?我將行保存在帶有標識字段的表中,但是隻是從nHibernate開始。問候 – 2013-06-26 16:58:59

+0

它只是object.Id或任何你的ID字段被稱爲。 – 2013-07-07 23:47:33

回答

2

好的,問題在我的代碼中的其他地方。即使您未提交交易或刷新交易,您也可以在保存後立即獲取Id。

謝謝大家的答案,但不幸的是他們都沒有完全正確。

0

也許它沒有在數據庫中設置爲自動生成?正如Mattias Jakobsson所說,id應該在會話之後設置.Save

0

由於它是一個事務NHibernate推遲更改,因此INSERT不會發送到數據庫 - 並且數據庫不會生成ID。做Session.Flush() - 這不會停止事務,但您的更改(INSERT)將被執行。或使用分配的ID。或者不要總是開始事務 - 明確地做這件事(例如S#arp Architecture使用[Transaction]屬性)。

0

我覺得爲每個會話啓動一個事務是個壞主意。我使用session-per-request,並在Session_EndRequest中啓動並提交一個事務。但是,我通常在頁面上有一個事務,以便我可以處理那裏發生的任何錯誤 - 在EndRequest發生的時候,執行任何操作都已經太晚了,但卻顯示了一條通用的錯誤消息。

如果您使用數據庫生成的(身份)ID,那麼您將不得不刷新會話以生成ID。

+0

你應該爲每個會話使用一個事務,甚至讀取。否則,您將無法充分利用緩存 - 請參閱:http://ayende.com/Blog/archive/2008/12/28/nh-prof-alerts-use-of-implicit-transactions-is-discouraged.aspx – UpTheCreek 2010-10-30 19:00:46

+0

我同意,除非您的意思是每個會話有一筆交易。我的答案可能更清晰,但我反對讓交易生命週期等於請求生存期。每個會話有多個事務沒有問題。 – 2010-10-30 19:51:09

7

當session.Save()或session.SaveOrUpdate()被一個瞬態實體調用時,NHibernate生成一個id。此時,實體的id屬性被設置並可以使用。

如果id生成器需要數據庫訪問,它會在這個時候發生。因此,對於身份生成器,插入將在此時執行,任何未決的插入都將執行。

否則,刀片被掛起,直到session被同步,這將發生:

  • 從查找()或可枚舉()
  • 從NHibernate.ITransaction.Commit)的一些調用(
  • 從ISession.Flush()