我在Asp.net MVC应用程序中使用Fluent NHibernate。我将它设置为在每个请求上启动会话和事务,并在请求结束时提交事务。但是,我想要做的是保存一个对象(在这种情况下,一个新的“公司”),然后重定向到该新公司的详细信息页面。如何获取新公司的ID以便我可以重定向?如果我在session.Save(公司)之后得到Id,则为null。这是有道理的,因为它尚未提交,但是,似乎应该有一个相对简单的方法来做到这一点,而不提交当前的事务并开始一个新的事务。
答案 0 :(得分:7)
当使用瞬态实体调用session.Save()或session.SaveOrUpdate()时,NHibernate会生成一个id。此时,实体的id属性已设置并可以使用。
如果id生成器需要数据库访问,则此时会发生。因此,对于Identity生成器,此时将执行插入,任何挂起的插入都将执行。
否则,插入将处于暂挂状态,直到刷新会话才会发生:
答案 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。