Не знаю, как продолжить удаление в NHibernate - PullRequest
3 голосов
/ 06 августа 2010

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

Как я могу это сделать? Помогите пожалуйста.

У меня есть 3 таблицы, выпуск, проект, категория

Отношения следующие: 1. У проекта может быть много проблем, проблема связана только с одним проектом 2. Проблема может иметь только одну категорию 3. Проект может иметь одну или несколько категорий

Issue.hbm.xml выглядит следующим образом:

 <id name="id" type="Int32" unsaved-value="0" access="field">
  <column name="ID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Issue"/>
  <generator class="native" />
</id>
<many-to-one name="Project" class="API.Project, API">
  <column name="ProjectID" length="4" sql-type="int" not-null="false"/>
</many-to-one>
<many-to-one name="Category" class="API.Category, API">
  <column name="CategoryID" length="4" sql-type="int" not-null="false"/>
</many-to-one>

project.hbm.xml

<id name="id" type="Int32" unsaved-value="0" access="field">
  <column name="ID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Project"/>
  <generator class="native" />
</id>
<property name="Name" type="String">
  <column name="Name" length="200" sql-type="varchar" not-null="true" unique="true" index="IX_Project_Name"/>
</property>

category.hbm.xml

<id name="id" type="Int32" unsaved-value="0" access="field">
      <column name="ID" sql-type="int" not-null="true" unique="true" index="PK_Category"/>
      <generator class="native" />
    </id>
    <property name="Name" type="String">
      <column name="Name" length="50" sql-type="varchar" not-null="true" unique="true" index="IX_Category"/>
    </property>
    <many-to-one name="Project" class="API.Project, API" >
      <column name="ProjectID" length="4" sql-type="int" not-null="false"/>
    </many-to-one>

Ответы [ 2 ]

1 голос
/ 11 августа 2010

IMO, если вы не должны быть в состоянии что-то сделать, классы не должны позволять это.

Вы не предоставили код своих классов.Как бы то ни было, убедитесь, что на бизнес-объектах возможны только допустимые операции.С NH вы используете ORM.Ключом вашего приложения является не база данных, а модель вашего класса.Если вы на самом деле не используете всю мощь объектной ориентации, вы не получаете всю мощь NH.

Скорее всего, решение проблемы заключено в инкапсуляции.само по себе всегда должно обеспечивать минимальную проверку согласованности.Вы, вероятно, должны сделать ProjectID категории не нулевым.(иногда у NH возникают проблемы с ненулевыми ограничениями, например, когда есть циклические ссылки. Затем их нужно удалить).

Не по теме: обычно вам не нужно указывать sql-типы.Они установлены NH на значимые значения по умолчанию.И еще: вам не нужно писать схему базы данных самостоятельно (если вы не находитесь в устаревшей базе данных).Вы можете использовать (настоятельно рекомендуется) класс ExportSchema, который записывает схему в соответствии с вашими файлами сопоставления.Тогда вам не нужно писать одну и ту же информацию дважды.

0 голосов
/ 10 августа 2010

Я предполагаю, что в вашей базе данных у вас есть внешние ключи для указанных идентификаторов? (если не вы должны сделать). В этом случае атрибут внешнего ключа в вашем отображении является обязательным, и в настоящее время он выглядит так, как будто его нет.

например. для файла issue.hbm.xml это может выглядеть примерно так:

<id name="id" type="Int32" unsaved-value="0" access="field"> 
  <column name="ID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Issue"/> 
  <generator class="native" /> 
</id> 
<many-to-one name="Project" class="API.Project, API" foreign-key="FK_Issue_Project"> 
  <column name="ProjectID" length="4" sql-type="int" not-null="false"/> 
</many-to-one> 
<many-to-one name="Category" class="API.Category, API" foreign-key="FK_Issue_Category"> 
  <column name="CategoryID" length="4" sql-type="int" not-null="false" /> 
</many-to-one>

Имена FK, которые я здесь привел, являются лишь предположениями, иди и проверь, что они есть в твоей БД, чтобы убедиться, что они правильные.

Как только NHibernate узнает о ваших отношениях с ФК, он должен позаботиться обо всем остальном:)

EDIT:

ООП - свойство внешнего ключа должно быть в элементе «многие к одному», а не в столбце. См исправленный код.

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