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

为什么NHibernate要删除不可变的类实例?,nhibernate,immutability,Nhibernate,Immutability,我正在尝试将一个应用程序从NHibernate1.x迁移到2.1,我注意到了一些奇怪的事情:我的不可变对象正在集成测试中被删除 例如,此测试用于通过: [Test, ExpectedException(typeof(NHibernate.HibernateException))] public void DeleteExistingInstanceThrows() { // Note: NHib transaction is opened/rolled back in test setu

我正在尝试将一个应用程序从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));
}
对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>

我想我遗漏了一些基本的东西,但我一直在搜索web,寻找可能忽略可变属性的任何原因,结果发现是空的

更新:


通过Log4Net登录,很明显NHibernate正在向数据库发送delete命令。

在深入研究之后,我发现DefaultDeleteEventListener的OnDelete方法中注释掉了这段代码:

/*
if ( !persister.isMutable() ) {
throw new HibernateException(
"attempted to delete an object of immutable class: " +
MessageHelper.infoString(persister)
);
}*/
因此,在尝试删除不可变的实例时不会引发异常,并且在删除之后确实会发生,就好像该实例是可变的一样

我已经给一位NHibernate维护人员发了一封短信,上面写着我的发现——在我看来,这就像一个bug

另一张海报指出,该问题已在2009年10月31日发布的2.1.1版中修复

更新:


截至2011年2月,NHibernate现在可以再次删除不可变类实例。不可变对象应该是可删除的-事实上它们最初不是实际的bug。

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


/Emil

FYI,撤销NHib项目“修复”的提案(2010年12月)。看起来您应该能够删除不可变的实例,并且该错误与较旧的版本有关,而不是与较新的版本有关。您说过您在测试后回滚事务吗?因此,该行将回滚,而不是删除。数据库探查器应该在这里有所帮助。