NHibernate - 通过非PK外键映射集合

时间:2012-03-16 11:36:09

标签: c# asp.net-mvc nhibernate

好的,不要问为什么,但我们要求以下类别结构:

  1. 系统定义的根类别的集合(我们正在使用这些的枚举)
  2. 用户定义的子类别的集合,每个子类别具有根类别ID外键
  3. 系统定义的子子类别
  4. 的集合

    所以,看起来有点像这样:

    系统定义的根类别 - >用户定义的子类别 - > sys定义的叶子类别 - >项目

    我们需要根据子类别的根类别加载预定义的类别。例如,如果我们有:

    车辆 - >我的蒙迪欧 - > [车轮,立体声,仪表板]

    用户定义的“我的蒙迪欧”子猫会根据它的根类别(车辆)获取它的子类别。

    所以我们有这种反向的多对多关系:

    rootCats --1---------0..*-- user-defined cats
       |                                |
       1                               0..n
       |                                |
       |                                |
       |                                |
      0..*                              |
       |                                |
    pre-defined cats--1------------------
    

    我尝试使用以下内容在nhibernate中映射:

    <set name="PreDefinedSubCategories" lazy="false" cascade="none" mutable="false">
      <key column="vaultCategoryId" property-ref="Category" />
      <one-to-many class="PreDefinedVaultCategory" />
    </set>
    

    但是,不推荐使用property-ref属性,无论如何它都会抛出“集合与任何会话无关”的错误。

    有没有人使用nhibernate实现这样的东西。如果是这样,有没有一个很好的方法,或者我只是定义一个方法来过滤所有叶猫后加载?

1 个答案:

答案 0 :(得分:0)

我猜你不能使用where =&#34;&#34;集合映射的属性,除非它接受参数(我怀疑)

也许你应该去找:

  • 从您的用户类别到您的根类别的多对一
  • 从您的根类别到您的子子类别的集合(一对多) 这样你就可以拥有userCategory.rootCategory.subsubCategories

我猜你的用户定义的类别和你的子子类别之间也有一个关系表(从根类别的可用子子类别中选择) 然后还可以查看从用户定义的类别到子子类别

的集合(多对多)