У меня есть класс «Фото» и класс «Комментарий». Фото может содержать несколько комментариев.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 каскадная настройка?
Спасибо за предложение. Я только что пробовал это, но все тот же вопрос/сообщение об ошибке. Если я удалю существующее отношение/ограничение в SQL Server, то удаление файла «Фотография» происходит без каких-либо ошибок, но оставляет мою сиротскую связанную запись комментария в БД. Это похоже на то, что он только замечает, как все настроено в SQL Server, и игнорирует любые каскадные настройки вне SQL Server. – marcusstarnes
Вам определенно нужно удалить not-null = "true", а затем добавить inverse = "true", который предложил Феличе, и это действительно необходимо, и, наконец, оставить cascade = "all-delete-orphan". Я бы не столкнулся с SQL-сервером, поскольку то, что вы делаете, не имеет отношения к тому, что NHibernate нужно делать. Да, если добавление каскадного удаления на SQL-сервере может помочь, но это проблема, которая может быть решена полностью с правильной настройкой файлов сопоставления сущностей. Поэтому, если бы я был вами, я бы удалил SQL-ограничение с сервера и повторю попытку с приведенными выше рекомендациями для файлов сопоставления. – tolism7
Спасибо за дополнительную информацию tolism7. ОК, я удалил все ограничения SQL Server, удалил not-null = "true" из много-одного и добавил inverse = "true" в сумке, но когда я удаляю Фото, он все равно остается сиротой. Комментарии в DB :( – marcusstarnes