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
2 回目に呼び出されると、これらのクエリが生成されます (someCondition
は false です) 。
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 の奥深くで、間違った is が WHERE 句に割り当てられています...
奇妙な点は、これが Oracle でのみ発生することです。NHibernate を MsSql に切り替えると、すべてがうまく機能します。