Почему NHibernate удаляет неизменный экземпляр класса? - PullRequest
2 голосов
/ 06 октября 2009

Я пытаюсь перенести приложение из 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 мог быть проигнорирован, и я выдал пустой.

UPDATE:

При входе в Log4Net становится ясно, что NHibernate отправлял команду удаления в базу данных.

Ответы [ 2 ]

3 голосов
/ 08 октября 2009

После копания я обнаружил, что этот блок кода закомментирован в методе OnDelete DefaultDeleteEventListener:

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

В результате не возникает исключение при попытке удалить неизменяемый экземпляр, и удаление действительно происходит впоследствии, как если бы экземпляр был изменяемым.

Я отправил заметку сопровождающему NHibernate с моими выводами - для меня это похоже на ошибку.

Отмеченный другим автором, эта проблема была исправлена ​​в выпуске 2.1.1 от 31 октября 2009 года.

UPDATE:

По состоянию на февраль 2011 года NHibernate теперь может снова удалять неизменяемые экземпляры классов. Неизменяемые объекты должны быть удаляемыми - тот факт, что они изначально не были, был настоящей ошибкой.

0 голосов
/ 09 ноября 2009

У меня была точно такая же проблема в той же ситуации (обновление с 1.x). Ошибка была исправлена ​​в 2.1.1, которая была выпущена 31 октября.

/ Emil

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...