3

У меня есть класс «Фото» и класс «Комментарий». Фото может содержать несколько комментариев.NHibernate One-To-Many Delete Not Cascading

У меня это настроено как отношение «один ко многим» в моем файле сопоставления HBM и установите cascade = «all-delete-orphan» в сумке «Комментарии» в файле сопоставления Photo.hbm.xml.

Однако, если я пытаюсь удалить фотографию, которая имеет 1 или больше комментариев, связанные с ним, я получаю «The ВЕИТ конфликтный с ссылочным ограничением„FK_Comments_Photos“»

Я попробовал несколько другого каскад варианты против сумки комментариев в моем Photo.hbm.xml, но независимо от того, что я установил, я получаю одинаковый результат каждый раз. Я просто хочу иметь возможность удалить фотографию и автоматически удалять любые связанные комментарии.

Вот моя фотография отображение (отредактированный для краткости):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" .... default-access="property" default-cascade="none" default-lazy="true"> 
<class xmlns="urn:nhibernate-mapping-2.2" name="Photo" table="Photos"> 
    <id name="PhotoId" unsaved-value="0"> 
     <column name="PhotoId" /> 
     <generator class="native" /> 
    </id> 
    ... 
    <bag name="Comments" table="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1"> 
     <key column="PhotoId" /> 
     <one-to-many class="Comment" /> 
    </bag> 
</class> 

Вот мой комментарий отображение (отредактированный для краткости):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ... default-access="property" default-cascade="none" default-lazy="true"> 
<class xmlns="urn:nhibernate-mapping-2.2" name="Comment" table="Comments"> 
    <id name="CommentId" unsaved-value="0"> 
     <column name="CommentId"></column> 
     <generator class="native" /> 
    </id> 
    ... 
    <property name="Author" not-null="true" /> 
    <property name="Body" not-null="true" /> 
    <property name="Approved" not-null="true" /> 
    <many-to-one name="Photo" not-null="true"> 
     <column name="PhotoId" /> 
    </many-to-one> 
</class> 

ли кто-нибудь есть какие-либо предложения относительно того, почему каскад не происходит, когда я пытаюсь удалить фотографию с помощью комманды связанных с ним?

UPDATE: Единственный способ, которым я могу получить каскад случиться, чтобы настроить «Удалить правило» в SQL Server против этих отношений «Каскад», и при этом означает, что мне не нужно указать любое каскадное действие в моем NHibernate Mapping. Однако это не идеально для меня - я бы хотел сконфигурировать поведение каскада в NHibernate Mapping в идеале, поэтому я все еще смущен тем, почему он, похоже, не обращает внимания на мой NHibernate каскадная настройка?

ответ

4

Мое предположение заключается в том, что проблема связана с тем фактом, что для множественного числа в сопоставлении комментариев установлено значение not-null = "true". Из-за этого NHibernate не имеет права временно установить это свойство в значение null, прежде чем оно удалит объект Photo, и, следовательно, когда происходит удаление объекта Photo, SQL Server выбрасывает исключение внешнего ключа.

Если я правильно помню, в порядке действий при удалении является:

  1. Установите значение внешнего ключа к нулю во всех дочерних объектов
  2. Удалить родительский объект
  3. Удалить все дочерние ссылки

Попытайтесь удалить не-null = "true" из множества-к-одному и посмотреть, что произойдет.

+0

Спасибо за предложение. Я только что пробовал это, но все тот же вопрос/сообщение об ошибке. Если я удалю существующее отношение/ограничение в SQL Server, то удаление файла «Фотография» происходит без каких-либо ошибок, но оставляет мою сиротскую связанную запись комментария в БД. Это похоже на то, что он только замечает, как все настроено в SQL Server, и игнорирует любые каскадные настройки вне SQL Server. – marcusstarnes

+0

Вам определенно нужно удалить not-null = "true", а затем добавить inverse = "true", который предложил Феличе, и это действительно необходимо, и, наконец, оставить cascade = "all-delete-orphan". Я бы не столкнулся с SQL-сервером, поскольку то, что вы делаете, не имеет отношения к тому, что NHibernate нужно делать. Да, если добавление каскадного удаления на SQL-сервере может помочь, но это проблема, которая может быть решена полностью с правильной настройкой файлов сопоставления сущностей. Поэтому, если бы я был вами, я бы удалил SQL-ограничение с сервера и повторю попытку с приведенными выше рекомендациями для файлов сопоставления. – tolism7

+0

Спасибо за дополнительную информацию tolism7. ОК, я удалил все ограничения SQL Server, удалил not-null = "true" из много-одного и добавил inverse = "true" в сумке, но когда я удаляю Фото, он все равно остается сиротой. Комментарии в DB :( – marcusstarnes

2

Попробуйте с inverse="true" на сумке коллекции вашего картографирования.

+0

Я также попробовал это (когда ничего не работало), но без успеха, к сожалению. – marcusstarnes

1

У меня была схожая проблема на 1 день .. и она была расстроена.

Наконец, решение сводилось к БД. мне пришлось изменить ключевые ограничения FK в «INSERT UPDATE СПЕЦИФИКАЦИИ» «Удалить правило»: от «Нет действий» к «Каскад»

дополнительно можно также установить «Обновить правило»: от «Нет действий» в 'каскад'

0

You может указать опцию удаления-каскадный в NH:

<bag name="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1"> 
    <key column="PhotoId" on-delete="cascade"/> 
    <one-to-many class="Comment" /> 
</bag> 

Вы, вероятно, следует сделать обратное. Тогда я задаюсь вопросом, где указан ваш столбец FK_Comments_Photos.