我在Asp.net MVC應用程序中使用流利NHibernate。我已經設置好每個請求都啓動會話和事務,並在請求結束時提交事務。但是,我想要做的是保存一個對象(在本例中是一個新的「公司」),然後重定向到新公司的詳細信息頁面。我如何獲得新公司的ID以便我可以重定向?如果我在session.Save(公司)後獲得Id,則它爲空。這是有道理的,因爲它尚未提交,但是,似乎應該有一種相對簡單的方法來做到這一點,而無需提交當前事務並開始新事務。Fluent NHibernate獲取保存對象的ID
回答
好的,問題在我的代碼中的其他地方。即使您未提交交易或刷新交易,您也可以在保存後立即獲取Id。
謝謝大家的答案,但不幸的是他們都沒有完全正確。
也許它沒有在數據庫中設置爲自動生成?正如Mattias Jakobsson所說,id應該在會話之後設置.Save
由於它是一個事務NHibernate推遲更改,因此INSERT不會發送到數據庫 - 並且數據庫不會生成ID。做Session.Flush() - 這不會停止事務,但您的更改(INSERT)將被執行。或使用分配的ID。或者不要總是開始事務 - 明確地做這件事(例如S#arp Architecture使用[Transaction]屬性)。
我覺得爲每個會話啓動一個事務是個壞主意。我使用session-per-request,並在Session_EndRequest中啓動並提交一個事務。但是,我通常在頁面上有一個事務,以便我可以處理那裏發生的任何錯誤 - 在EndRequest發生的時候,執行任何操作都已經太晚了,但卻顯示了一條通用的錯誤消息。
如果您使用數據庫生成的(身份)ID,那麼您將不得不刷新會話以生成ID。
你應該爲每個會話使用一個事務,甚至讀取。否則,您將無法充分利用緩存 - 請參閱: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
我同意,除非您的意思是每個會話有一筆交易。我的答案可能更清晰,但我反對讓交易生命週期等於請求生存期。每個會話有多個事務沒有問題。 – 2010-10-30 19:51:09
當session.Save()或session.SaveOrUpdate()被一個瞬態實體調用時,NHibernate生成一個id。此時,實體的id屬性被設置並可以使用。
如果id生成器需要數據庫訪問,它會在這個時候發生。因此,對於身份生成器,插入將在此時執行,任何未決的插入都將執行。
否則,刀片被掛起,直到session被同步,這將發生:
- 從查找()或可枚舉()
- 從NHibernate.ITransaction.Commit)的一些調用(
- 從ISession.Flush()
- 1. 獲取上次保存的對象ID
- 2. 如何在MVP + Fluent中保存對象NHibernate
- 3. 從Fluent Nhibernate獲取表名
- 4. 通過NHibernate中的id或父對象獲取子對象?
- 5. Fluent-NHibernate和自動保存DateTime
- 6. 獲取與關聯保存的對象的ID
- 7. Fluent NHibernate中的NHibernate L2緩存配置
- 8. nHibernate with hiLo id generation - 在保存對象圖時選擇'N + 1'
- 9. NHibernate的獲取基於聚集根ID對象A的集合
- 10. 如何在保存域對象後獲取id?
- 11. 在nhibernate中保存會話後獲取ID(自動編號)?
- 12. Fluent Nhibernate
- 13. 在NHibernate中保存對象IInterceptor
- 14. 流利NHibernate映射 - 保存子對象
- 15. NHibernate保存對象,列爲空
- 16. Nhibernate - 從屬表保存對象
- 17. Django內嵌formset - 獲取保存對象
- 18. 如何獲取保存的對象/新創建的對象
- 19. Fluent Nhibernate如何在SubclassMap中指定Id()
- 20. 通過id()獲取對象?
- 21. nHibernate:創建子對象時保存新的父對象
- 22. 從流暢的nhibernate的子對象中獲取父對象
- 23. Fluent Nhibernate left join
- 24. c#nhibernate fluent mysql
- 25. Fluent NHibernate NonUniqueObjectException
- 26. SharpArchitecture/Fluent NHibernate
- 27. Rhino.Commons + Fluent NHibernate
- 28. Fluent NHibernate AutoMap
- 29. Fluent NHibernate中的內存泄漏
- 30. NHibernate獲取對象沒有代理
你應該可以在你調用session.save之後得到id。你使用什麼id類型? – 2010-02-11 07:18:25
用於獲取新行ID值的指令或代碼是什麼?我將行保存在帶有標識字段的表中,但是隻是從nHibernate開始。問候 – 2013-06-26 16:58:59
它只是object.Id或任何你的ID字段被稱爲。 – 2013-07-07 23:47:33