为什么NHibernate会删除不可变的类实例?

时间:2009-10-06 13:05:47

标签: nhibernate immutability

我正在尝试将应用程序从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正在将delete命令发送到数据库。

2 个答案:

答案 0 :(得分:3)

在挖掘之后,我发现在DefaultDeleteEventListener的OnDelete方法中注释掉了这段代码:

/*
if ( !persister.isMutable() ) {
throw new HibernateException(
"attempted to delete an object of immutable class: " +
MessageHelper.infoString(persister)
);
}*/

因此,在尝试删除不可变实例时不会引发异常,并且删除实际上会在事后发生,就好像实例是可变的一样。

我已经向NHibernate维护者发送了一条记录,其中包含我的发现 - 看起来像是一个错误。

另一张海报注意到,此问题已在2009年10月31日发布的2.1.1版中得到修复。

更新:

截至2011年2月,NHibernate现在能够再次删除不可变类实例。不可变对象应该是可删除的 - 事实上它们最初不是真正的错误。

答案 1 :(得分:0)

我在同样的情况下遇到了完全相同的问题(从1.x升级)。该错误已于10月31日发布的2.1.1中修复。

/埃米尔

相关问题