在NHibernate中删除实体时自动删除关联

时间:2010-09-08 13:16:25

标签: nhibernate many-to-many

我有以下实体:

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 个答案:

答案 0 :(得分:2)

你有错误的想法。如果要从Module删除课程对象,请手动执行此操作。 NHibernate只跟踪您的操作,并且在调用session.Commit()时,ModuleLesson之间的引用将在数据库中删除。

调用session.Delete(lesson)会从数据库中删除课程对象(如果正确设置了外键,那么ModuleLesson之间的引用当然会被删除,但它不对NHibernate负责。“ / p>

总之,无法通过调用Module.Lessons自动从session.Delete(lesson)列表中删除课程对象。 NHibernate不会跟踪此类实体引用。

答案 1 :(得分:0)

事实证明,如果我们不需要IList语义并且可以使用ICollection,则可以通过从Lesson向Module添加一个引用来解决更新问题,例如:

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也会自动从{{1}}中删除。这也适用于列表,但列表索引未正确更新,并导致列表中出现“漏洞”。