我有以下实体:
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>
,就像我想要的那样并进行测试。
答案 0 :(得分:2)
你有错误的想法。如果要从Module
删除课程对象,请手动执行此操作。 NHibernate只跟踪您的操作,并且在调用session.Commit()
时,Module
和Lesson
之间的引用将在数据库中删除。
调用session.Delete(lesson)
会从数据库中删除课程对象(如果正确设置了外键,那么Module
和Lesson
之间的引用当然会被删除,但它不对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}}中删除。这也适用于列表,但列表索引未正确更新,并导致列表中出现“漏洞”。