我正在尝试将应用程序从 NHibernate 1.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));
}
应该抛出对 CommitChanges 的调用,因为试图删除其类型映射为 mutable="false" 的实例。然而,在更新了预期的异常类型之后,这个测试现在失败了(因为没有抛出异常)。我检查了数据库并通过测试进行了跟踪,创建了记录,加载了实例,然后再次删除了记录。
有问题的类与另一个类映射到同一个表 - 它或多或少旨在作为该数据子集的只读视图。这是类映射:
<?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>
我希望我遗漏了一些基本的东西,但是我一直在网上搜索 mutable 属性可能被忽略的任何原因,但我发现是空的。
更新:
使用 Log4Net 进行日志记录,很明显 NHibernate 正在向数据库发送删除命令。