使用非PK列映射一对多自表

时间:2009-11-25 20:57:37

标签: nhibernate nhibernate-mapping

嘿,我有一个遗留数据库,其中一个Person对象被映射,有一个家庭成员的集合,如下所示:

   class Person
    {
      ...
      string Id; /* 9-digits string */
      IList<Person> Family;
      ...
    }

PERSON表似乎是:

Id: CHAR(9), PK
FamilyId: INT, NOT NULL

以及其他几个不相关的专栏。 我正在尝试使用FamilyId列将Family集合映射到PERSON表,而不是上面提到的PK。 所以,我实际上有一对多的自我表引用。

当我的映射看起来像这样时,我收到一条错误,说“投放无效”:

...
<set name="Family" table="Person" lazy="false"> 
   <key column="FamilyId" /> 
   <one-to-many class="Person" /> 
</set>
...

因为很明显,NHibernate正在尝试在PK列,Id和'辅助'列FamilyId之间进行连接,而不是将FamilyId列连接到自身。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我可能无法掌握您在此处使用的数据,但听起来我的数据模型不完整。我希望你有一个Family实体和一个Person实体,这样每个Person都有一个属于它的Family属性,而且Family实体有一个属于该族的Person对象列表。

我想这里缺少的是有关您尝试映射的数据库架构的足够信息。在FamilyId中有什么值,它们是否引用了其他表(即Family表的外键)?

答案 1 :(得分:0)

更好地说:

 [ID] - PK, char(9) 
 [FirstName], char(25) not-null 
 [LastName], char(25) not-null 
 [FamilyId], int not-null

实际上,可以使用使用FamilyId和PersonId的链接表绑定族成员来建模族关系。但我现在无法创建它,因为它是现有的生产系统。 目前,我必须以某种方式为家庭收藏品建模。除了BryanD提供的解决方案,看起来相当不错,有人可以使用FamilyId列提供一种将表连接到自身的方法,而不是PK吗?