2009-03-02 41 views
2

我有以下对象模型:NHibernate的映射麻烦

  • 顶层抽象类Element多子女和后代。
  • A类Event
  • 每个Element包含一包Event s。
  • 每个Event都有一个父指针Element

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

但是,我想使用每个具体类策略的表。所以,类Element未映射到数据库。我试图通过这种方式来解决它:Element的每个具体后代都定义了它自己的袋子Event s。这个问题是每个<bag>元素包含一个<key>元素。该关键指向EventParent财产。它还使Event的表中的Parent列成为包含Bag的表的外键!但是一列不能成为几个表的外键,而我在插入时遇到了异常。

我也试着让Event的表中的Parent字段成为多对多的字段。这工作。但是,当我想要使关系双向时,意思是,为了给Element的后代添加行李,我会回到同样的问题。 Bag =>外键=>插入时出现异常。

我敢肯定,这种情况并不像看起来那么独特。 非常感谢您的帮助。

回答

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> 

你可以有这样一个外键外键约束,但没有非空约束,因为只使用这些外键中的一个。

要确实只有一个带有所有约束的外键,则需要将元素映射到单独的表。