我在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