2010-02-11 89 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()