流畅的NHibernate获取已保存对象的Id

时间:2010-02-11 06:56:57

标签: asp.net-mvc nhibernate fluent-nhibernate

我在Asp.net MVC应用程序中使用Fluent NHibernate。我将它设置为在每个请求上启动会话和事务,并在请求结束时提交事务。但是,我想要做的是保存一个对象(在这种情况下,一个新的“公司”),然后重定向到该新公司的详细信息页面。如何获取新公司的ID以便我可以重定向?如果我在session.Save(公司)之后得到Id,则为null。这是有道理的,因为它尚未提交,但是,似乎应该有一个相对简单的方法来做到这一点,而不提交当前的事务并开始一个新的事务。

5 个答案:

答案 0 :(得分:7)

当使用瞬态实体调用session.Save()或session.SaveOrUpdate()时,NHibernate会生成一个id。此时,实体的id属性已设置并可以使用。

如果id生成器需要数据库访问,则此时会发生。因此,对于Identity生成器,此时将执行插入,任何挂起的插入都将执行。

否则,插入将处于暂挂状态,直到刷新会话才会发生:

  • 来自Find()或Enumerable()
  • 的一些调用
  • 来自NHibernate.ITransaction.Commit()
  • 来自ISession.Flush()

答案 1 :(得分:2)

好的,问题出现在我的代码中。即使您尚未提交事务或刷新事务,也可以在保存后立即获取Id。

感谢大家的答案,但不幸的是,这些答案都不完全正确。

答案 2 :(得分:0)

也许它没有在数据库中设置为自动生成?正如Mattias Jakobsson所说,id应该在Session.Save之后设置

答案 3 :(得分:0)

由于它是一个事务NHibernate推迟更改,因此INSERT不会发送到数据库 - 并且数据库不会生成ID。 Do Session.Flush() - 这不会停止事务,但您的更改(INSERT)将被执行。或使用指定的ID。或者不总是启动事务 - 明确地执行此操作(例如S#arp Architecture使用[Transaction]属性)。

答案 4 :(得分:0)

我认为为每个会话启动一个事务是个坏主意。我正在使用session-per-request,我在Session_EndRequest中启动并提交一个事务。但是,我通常在页面上有一个事务,以便我可以处理在那里发生的任何错误 - 在EndRequest发生时,为了做任何事情,为时已晚,但提供了一般错误消息。

如果您使用的是数据库生成(身份)ID,那么您必须刷新会话才能生成ID。