2

我有以下对象模型:

  • Element一个有很多孩子和后代的顶级抽象类。
  • 一个班Event
  • 每个都Element包含一袋Events。
  • 每个Event都有一个指向 parent 的指针Element

到目前为止 - 相当标准的一对多关系。

但是,我想根据具体的类策略使用表。因此,该类Element未映射到数据库。我试图以这种方式解决它:每个具体的后代都Element定义了自己的 Bag of Events。这样做的问题是每个<bag>元素都包含一个<key>元素。该关键点指向 的Parent属性Event。它还使s 表Parent中的列成为Event包含 Bag 的表的外键!但是一列不能是多个表的外键,我在插入时遇到异常。

我还尝试使s 表Parent中的字段Event成为多对任意类型的字段。那行得通。但是当我想使关系双向时,意味着将包添加到我的后代中,Element我又回到了同样的问题。包 => 外键 => 插入异常。

我确信这个案例并不像看起来那么独特。预先感谢您的帮助。

4

1 回答 1

1

有点晚了,但我有一些建议。

如果您使用“每个具体类的表”,就好像您将映射完全独立的表。因此,您需要单独的外键或多对任意键。

多对任意存储类型名称,NH 知道外键指向的位置。但是不可能对这样的外键进行限制。

如果您有多个包含相同类型物品的包,请确保它们都定义了不同的外键:

<class name="A">
  <!-- ... -->
  <bag name="Events">
    <key column="A_FK"/>
    <one-to-many class="Event"/>
   </bag>
</class>

<class name="B">
  <!-- ... -->
  <bag name="Events">
    <key column="B_FK"/>
    <one-to-many class="Event"/>
   </bag>
</class>

您可以对这样的外键进行外键约束,但不能有非空约束,因为只使用了这些外键之一。

要真正只有一个具有所有约束的外键,您需要将元素映射到单独的表。

于 2009-04-27T08:26:24.360 回答