アプリをNHibernate1.xから2.1に移行しようとしていますが、奇妙なことに気づきました。統合テストで不変オブジェクトが削除されています。
たとえば、このテストは以前は合格していました。
[Test, ExpectedException(typeof(NHibernate.HibernateException))]
public void DeleteExistingInstanceThrows()
{
// Note: NHib transaction is opened/rolled back in test setup/teardown
m_testRecordId = CreateRecordInDB();
var dao = new NHibFactory().GetTransDao();
var obj = dao.GetById((long)m_testRecordId, false);
dao.Delete(obj);
dao.CommitChanges();
Assert.IsFalse(TestRecordExists(m_testRecordId));
}
タイプがmutable="false"でマップされているインスタンスを削除しようとするため、CommitChangesの呼び出しがスローされます。ただし、予期される例外タイプを更新した後、このテストは失敗します(例外がスローされないため)。データベースをチェックしてテストをトレースしたところ、レコードが作成され、インスタンスが読み込まれ、その後、レコードが再び削除されます。
問題のクラスは、別のクラスと同じテーブルにマップされます。これは、多かれ少なかれ、そのデータのサブセットの読み取り専用ビューとして意図されています。クラスマッピングは次のとおりです。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Sample.Trans, Sample" table="tblTrans" mutable="false">
<id name="Id" column="transId" unsaved-value="0">
<generator class="identity" />
</id>
<property name="Amount" column="amount" type="Decimal" />
<!-- ...a half dozen other mapped fields... -->
</class>
</hibernate-mapping>
基本的なものが欠けていると思いますが、可変属性が無視される可能性がある理由でWebを精査していて、空になっています。
アップデート:
Log4Netでログを記録すると、NHibernateがデータベースに削除コマンドを送信していたことは明らかです。