2009-01-11 53 views
4

我已经将FlushMode.Never的NHibernate会话设置为FlushMode属性,但是当我调用session.Save(User)时,无论如何都会对数据库进行调用。这是应该如何工作?我认为它不应该做一个插入,直到我叫Flush()。保存NHibernate FlushMode

编辑: 我发现这个问题,我改变了主键guid,它的工作。是否还有其他类型(即没有guid主键)可以使用?我宁愿有一个数字,而不是一个GUID ...

+0

有几个ID发电机各地NH - http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators- reveal.aspx or http://ayende.com/Blog/archive/2009/03/20/nhibernate-avoid-identity-generator-when-possible.aspx – Rashack 2009-04-28 08:13:21

回答

8

您正在使用本地生成器,对不对?

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

作为替代的GUID和身份,你可以试试“增量”发电机,看它是否适合您的需要: 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

我发现这个问题,我正在使用身份作为主键。改变它为GUID工作。

0

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

这应该确保没有调用数据库。

+0

我可能是错的,但我认为它仍然称为数据库,当生成器设置为Identity时,即使在事务中并且FlushMode为Commit时也是如此。 – NotDan 2009-01-16 03:28:42