2009-10-06 41 views
2

我正在尝试将应用程序从NHibernate 1.x迁移到2.1,并且我发现了一些奇怪的事情:我的集成测试中正在删除我的不可变对象。为什么NHibernate删除不可变的类实例?

例如,本次测试使用的经过:

[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调用应该抛出,因为试图删除一个实例,其类型映射与可变=“假”。但是,在更新预期的异常类型之后,此测试现在会失败(因为不会引发异常)。我检查了数据库并通过了测试,记录被创建,实例被加载,然后记录被再次删除。

正在讨论的类与另一个类映射到同一个表 - 它或多或少意图作为该数据子集的只读视图。这里的类映射:

<?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> 

我希望我失去了一些基本的东西,但我一直在网上淘任何原因可变属性可能会被忽略,我想出空。

UPDATE:

与log4net的记录,很显然,NHibernate的被发送删除命令到数据库。

+0

你说你测试后回滚事务?所以行被回滚,而不是被删除。数据库分析器应该在这里帮助。 – Canton 2009-10-08 02:57:46

回答

3

已经挖成之后,我发现在DefaultDeleteEventListener的OnDelete方法注释掉的代码块:

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

其结果是,试图删除一个不变的情况下,当不发生异常,并删除确实事后发生,就好像实例是可变的。

我发送了一条消息给NHibernate的维护者,我的发现 - 看起来像是一个bug。

由另一个海报指出的那样,这个问题是从10月31日2009年固定在版本2.1.1

UPDATE:

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

+0

仅供参考,建议扭转NHib项目的这一“修复”(2010年12月)。看来你应该能够删除不可变的实例,并且这个错误是在旧版本中,而不是最新的版本。 – 2011-01-03 12:14:14

0

你为什么期待异常?你在db中创建行然后删除它,也许你不需要预期的异常?

+0

它应该引发异常,因为mutable = false。从文档:“不可变类,mutable =”false“,可能不会被应用程序更新或删除”。 – 2009-10-06 15:28:12

0

我在同样的情况下(从1.x升级)有完全相同的问题。该错误是固定在2.1.1被发布十月31

/周华健

+0

感谢您的单挑。 – 2009-11-09 13:38:01

相关问题