NHibernate.ObjectDeletedException - PullRequest
       5

NHibernate.ObjectDeletedException

1 голос
/ 27 августа 2009

Мне нужна помощь, чтобы понять, как действовать. Я создаю приложение для управления коллекцией записей, и у меня есть следующие сопоставления.

<class name="Soulful.Core.Domain.Model.Record,Soulful.Core" table="Record">
    <id name="Id" type="Int32" unsaved-value="0">
        <generator class="native" />
    </id>

    <many-to-one name="Artist" class="Soulful.Core.Domain.Model.Artist,Soulful.Core" foreign-key="FK_Artist_Id" cascade="all">
        <column name="ArtistId" not-null="true" />
    </many-to-one>

    .... more properties
</class>

<class name="Soulful.Core.Domain.Model.Artist,Soulful.Core" table="Artist">
    <id name="Id" type="Int32" unsaved-value="0">
        <generator class="native" />
    </id>

    <property name="Name" type="string" not-null="true" />
</class>

Я хочу, чтобы многие записи были привязаны к одному исполнителю, и это прекрасно работает. Но у меня возникают проблемы, когда я пытаюсь удалить запись. То, что я хотел бы сделать, это:

Удалить запись и исполнителя, если к этому исполнителю не подключены никакие другие записи. Если к исполнителю подключены записи, просто удалите запись.

При текущем отображении я получаю следующую ошибку при вызове сеанса. Удаление (запись);:

NHibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)[Soulful.Core.Domain.Model.Artist#3]

Вот как выглядит мой DeleteMethod:

public virtual void Delete(T entity)
{
    using (var session = GetSession())
    using (var transaction = session.BeginTransaction())
    {
        try
        {
            session.Delete(entity);
            transaction.Commit();
        }
        catch (HibernateException)
        {
            transaction.Rollback();
            throw;
        }
    }
}

Что мне нужно сделать, чтобы это работало так, как я хочу? Пожалуйста, не стесняйтесь излагать очевидное.

Обновление Наверное, я спрашиваю, нужно ли мне вручную обрабатывать удаление художников?

1 Ответ

3 голосов
/ 27 августа 2009

Ну, я не думаю, что у Записи должен быть каскад = "все" на Артисте.

Проблема в том, что вы вызываете delete на Artist, и когда вы сохраняете запись, она пытается повторно сохранить исполнителя (из-за каскада). Отсюда и ошибка:).

Поскольку у вас есть not-null в свойстве Исполнителя записи, вам не следует удалять Исполнителя, но следует удалить Запись, и Исполнитель должен быть удален автоматически.

...