保存时的NHibernate FlushMode

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

编辑:我发现了问题,我将主键更改为guid并且有效。 是否有其他类型(即没有guid主键)可以工作? 我宁愿有一个数字而不是一个guid ……

你使用的是原生发电机,对吧?

这个问题在于,由于它是生成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发电机

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

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

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

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

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