我们在 Oracle 中遇到了一个奇怪的问题。我将首先勾勒一些(简化的)上下文:
考虑这个到实体的映射:
public EntityMap()
{
Table("EntityTable");
Id(x => x.Id)
.Column("entityID")
.GeneratedBy.Native("ENTITYID").UnsavedValue(0);
Map(x => x.SomeBoolean).Column("SomeBoolean");
}
这个代码:
var entity = new Entity();
using (var transaction = new TransactionScope(TransactionScopeOption.Required))
{
Session.Save(entity);
transaction.Complete();
}
//A lot of code
if(someCondition)
{
using (var transaction = new TransactionScope(TransactionScopeOption.Required))
{
enitity.SomeBoolean = true;
Session.Update(entity);
transaction.Complete();
}
}
这段代码被调用了几次。它第一次生成以下查询:
select ENTITYID.nextval from dual
INSERT INTO Entity
(SomeBoolean, EntityID)
VALUES (0, 1216)
UPDATE Entity
SET SomeBoolean = 1
WHERE EntityID = 1216
第二次调用时会生成这些查询(someCondition
为假)
select ENTITYID.nextval from dual
INSERT INTO Entity
(SomeBoolean, EntityID)
VALUES (0, 1217)
现在麻烦开始了。从现在开始,每次插入都将使用正确的自动增量值,但更新将始终使用 1217
select ENTITYID.nextval from dual
INSERT INTO Entity
(SomeBoolean, EntityID)
VALUES (0, 1218)
UPDATE Entity
SET SomeBoolean = 1
WHERE EntityID = 1217
当然,这不是我们想要发生的。如果我在调试时检查 Id 的值,它包含正确的自动增量值。不知何故,在 NHibernate 的深处,不正确的被分配给了 WHERE 子句......
奇怪的是,这只发生在 Oracle 上。如果我将 NHibernate 切换到 MsSql,一切都会像魅力一样工作。