我正在使用Firebird数据库和NHibernate进行对象映射。我有一个名为Product
的表,其中包含ID
和ProductName
等典型字段,我正在使用Firebird的本机ID生成器为我自动生成ID。当我做一些测试时,我有一些类似于下面的代码:
session.Save(product);
try
{
transaction.Commit();
}
catch
{
//couldn't save
transaction.Rollback();
}
finally
{
session.Close();
}
想法是尝试保存产品,如果它不起作用,则回滚更改。当我测试它时,记录确实没有保存,但本机ID生成器已被更改。例如,生成器应该从值1开始。当我尝试使用上面的代码添加“坏”记录时,记录不会保存,但生成器将跳转到值2.所以,有没有办法我还要回滚ID生成器的任何更改?
提前致谢。
答案 0 :(得分:0)
这不是NHibernate的行为,而是数据库引擎。
请检查此问题:SQL Identity (autonumber) is Incremented Even with a Transaction Rollback
出于测试目的,您可以使用不同的生成器,例如Increment
,由NHiberante管理,在回滚和重启后...重置该值。检查5.1.4.1. generator,摘录:
<强>增量强>
生成任何整数类型的标识符,仅当没有其他进程将数据插入同一个表时才是唯一的。不要在群集中使用。