【问题标题】:NHibernate mapping troubleNHibernate 映射问题
【发布时间】:2010-10-10 20:28:02
【问题描述】:

我有以下对象模型:

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

到目前为止 - 非常标准的一对多关系。

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

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

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

【问题讨论】:

    标签: nhibernate mapping one-to-many


    【解决方案1】:

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

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

    many-to-any 存储类型名称,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>
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2010-10-11
      • 1970-01-01
      相关资源
      最近更新 更多