Почему не удаляется каскадирование с помощью этого файла конфигурации NHibernate? - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть файл NHibernate, указанный ниже, однако мне не разрешено удалять Вопрос из-за ограничения внешнего ключа в любой из двух таблиц Ответов. Желаемое поведение - удалять Ответы после удаления соответствующих Вопросов и установки параметров каскада в элементе Ответы.

Ниже находится файл конфигурации, кто-нибудь может увидеть, в чем проблема

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="Test.Domain" assembly="Test.Domain" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Question" abstract="true">
    <id name="Id" type="Int32">
      <generator class="hilo" />
    </id>
    <discriminator />
    <property name="Text" length="500" />
    <property name="Note" length="2000" />
    <property name="DateRun" />
    <many-to-one name="ChoiceType" column="ChoiceTypeId" />
    <bag name="Answers" inverse="true" cascade="all,delete-orphan">
      <key column="QuestionId" on-delete="cascade" />
      <one-to-many class="Answer" />
    </bag>
  </class>
  <class name="Answer" abstract="true">
    <id name="Id" type="Int32">
      <generator class="hilo" />
    </id>
    <many-to-one name="Question" column="QuestionId" />
    <many-to-one name="Group" column="GroupId" />
    <property name="Comment" />
  </class>
  <class name="Choice">
    <id name="Id" type="Int32">
      <generator class="hilo" />
    </id>
    <property name="Text" length="500" />
  </class>
  <class name="ChoiceType">
    <id name="Id" type="Int32">
      <generator class="hilo" />
    </id>
    <property name="Name" />
    <property name="Type" />
    <list name="Choices" cascade="all,delete-orphan">
      <key column="ChoiceTypeId" />
      <list-index column="ChoicesPos" />
      <one-to-many class="Choice" />
    </list>
  </class>
  <class name="Division">
    <id name="Id" type="Int32">
      <generator class="hilo" />
    </id>
    <property name="Name" />
  </class>
  <union-subclass name="FreeTextAnswer" extends="Answer">
    <property name="Text" length="500" />
  </union-subclass>
  <union-subclass name="MultipleChoiceAnswer" extends="Answer">
    <many-to-one name="Choice" column="ChoiceId" />
  </union-subclass>
  <subclass name="MultipleChoiceQuestion" extends="Question" />
  <subclass name="FreeTextQuestion" extends="Question" />
</hibernate-mapping>

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Не правда ли? Каскад = "все-удалить-сирота"

... с дефисом, в отличие от двух значений enum?

0 голосов
/ 27 сентября 2011

Ваше отображение коллекции ответов должно выглядеть следующим образом:

<bag name="Answers" inverse="true" cascade="all-delete-orphan">
  <key column="QuestionId"/>
  <one-to-many class="Answer" />
</bag>

Я удалил on-delete="cascade". Если вы хотите удалить один ответ из вопроса, вам придется «преследовать указатели». Установите ссылку на вопрос в NULL, в дополнение к удалению его из коллекции ответов:

answer.Question = null;
...