Автоматическое удаление ассоциаций при удалении сущностей в NHibernate - PullRequest
2 голосов
/ 08 сентября 2010

У меня есть следующие объекты:

namespace NhLists {
  public class Lesson {
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
  }
  public class Module {
    public virtual int Id { get; set; }
    public virtual IList<Lesson> Lessons { get; set; }
    public Module() {
      Lessons = new List<Lesson>();
    }
  }
}

И следующие сопоставления:

<class name="Module" table="Modules">
  <id name="Id">
    <generator class="identity"/>
  </id>
  <list name="Lessons" table="ModuleToLesson"
      cascade="save-update">
    <key column="moduleId"/>
    <index column="position"/>
    <many-to-many 
      column="lessonId" 
      class="NhLists.Lesson, NhLists"/>
  </list>
</class>
<class name="Lesson" table="Lessons">
  <id name="Id">
    <generator class="identity"/>
  </id>
  <property name="Title">
    <column name="Title" length="16" not-null="true" />
  </property>
</class>

Когда я удаляю урок по session.Delete(lesson), можно ли в любом случае разрешить NHibernate автоматически обновлять ассоциацию в Module.Lessons, чтобы удалить запись из набора? Или я вынужден пройти через все модули и найти урок и удалить его вручную?

Редактировать: Исправлены ICollection и <set> в сопоставлениях с IList<> и <list>, как я хочу, и их проверка.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

У вас ложная идея.Если вы хотите удалить объект урока из Module, вы делаете это вручную.NHibernate просто отслеживает такие ваши действия, и при вызове session.Commit() в базе данных удаляется ссылка между Module и Lesson.

Вызов session.Delete(lesson) удаляет объект урока из базы данных (если внешние ключиустановлены правильно, тогда ссылка между Module и Lesson, конечно, удаляется, но это не является обязанностью для NHibernate).

В заключение невозможно удалить объект урока из списка Module.Lessonsавтоматически по телефону session.Delete(lesson).NHibernate не отслеживает такие ссылки на сущности.

0 голосов
/ 08 сентября 2010

Оказывается, что если нам не нужна семантика IList и мы можем обойтись с ICollection, проблему обновления можно решить, добавив ссылку обратно из Урока в Модуль, например:

public class Lesson {
  ...
  protected virtual ICollection<Module> InModules { get; set; }
  ...
}

И к файлам сопоставления добавить:

<class name="Lesson" table="Lessons">
  ...
  <set name="InModules" table="ModuleToLesson">
    <key column="lessonId"/>
    <many-to-many column="moduleId" class="NhLists.Module, NhLists"/>
  </set>
</class>

Затем удаленный Lesson также удаляется из коллекции в Module автоматически. Это также работает для списков, но индекс списка не обновляется должным образом и вызывает «дыры» в списке.

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