保存时的NHibernate FlushMode

时间:2009-01-11 01:08:57

标签: c# nhibernate

我已经将NHibernate会话上的FlushMode属性设置为FlushMode.Never,但是当我调用session.Save(User)时,无论如何都会调用数据库。这是怎么回事?我认为在调用Flush()之前不应该插入。

编辑: 我找到了问题,我将主键更改为guid并且它有效。是否有其他类型(即没有guid主键)可以工作?我宁愿有一个号码而不是一个guid ......

3 个答案:

答案 0 :(得分:8)

您使用的是本机生成器,对吧?

这个问题在于,由于它是生成ID的DB,因此NHibernate需要往返才能获取它。例如,对于服务器的标识字段,必须在SCOPE_IDENTITY()返回有效密钥之前执行实际的INSERT语句。安全执行此操作的唯一方法是刷新会话。

作为guids和identity的替代品,您可以尝试使用“增量”生成器来查看它是否符合您的需求: http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/mapping.html#mapping-declaration-id-generator

您应该知道,如果您对应用程序进行集群,或者您将某个其他进程或应用程序插入到同一个表中,则此方法将不可行。

PS:如需进一步阅读,请尝试http://unhandled-exceptions.com/blog/index.php/2008/12/11/on-choosing-an-identity-type/

答案 1 :(得分:1)

我发现了这个问题,我使用了身份作为主键。将它改为guid工作。

答案 2 :(得分:0)

尝试在事务中包装session.Save(User)并将FlushMode设置为Commit。

<击>

这应该确保不会对数据库进行任何调用。