流畅的NHibernate继承

时间:2014-03-17 12:29:56

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

在我的数据库中,我有一个用户表'用户'谁对“仆人”有外键约束,谁又对“人”有外键约束。

' Servant'和'人物'现在变成了一个继承,所以' Person'是' Servant'的基类。 在这种情况下,NHibernate并不关心' Servant' ID不再使用' Person' ID。

我遇到的唯一问题是表格中的仆人的外键'用户'现在。 因为' Servant'和'用户' ID在过去不一定是平等的,现在这是一个很大的问题,因为NHibernate试图获取' Servant'用户使用' Servant' ID并在' Person'中查找表

有没有解决这个问题的方法让NHibernate仍然知道' Servant' ID? 我想做的最后一件事就是改变数据库中的任何内容。

2 个答案:

答案 0 :(得分:0)

是的,您可以从用户类中提供Servant Collection的映射。看起来像是映射到Servant类的自引用外键,关键在于如何定义映射,您仍然可以将ServentID映射到PersonID。

答案 1 :(得分:0)

您可以使用property-ref属性加入主键以外的列。


如果你讲一个谎言......

所以,你之前有这样的事情:

<class name="Person">
  <id name="Id"
      column="Id"
      type="Int32"
      generator="native" />
</class>

<class name="Servant">
  <id name="Id"
      column="Id"
      type="Int32"
      generator="native" />
  <many-to-one name="Person"
               column="Person_Id"
               not-null="true"
               unique="true" />
</class>

<class name="User">
  <id name="Id"
      column="Id"
      type="Int32"
      generator="native" />
  <many-to-one name="Servant"
               column="Servant_Id" />
</class>

在不更改数据库架构的情况下,您已删除<class name="Servant">并将其替换为:

<class name="Person">
  <!-- Rest of Person stays the same, except we insert this: -->
  <joined-subclass name="Servant">
    <key column="Person_Id" />
  </joined-subclass>
</class>

即使Person_Id不是真的 Servant表的主键,我们也告诉NHibernate假装它是 - 它仍然可以正常工作,只要该列为not nullunique。您现在遇到的问题是NHibernate想加入User.Servant_Id = Servant.Person_Id,因为它认为Person_IdServant表的主键。

那么,我们该如何解决呢?我们如何让NHibernate继续加入User.Servant_Id = Servant.Id

易。我们只是再次向NHibernate说谎,并告诉它User.Servant属性不应该加入Servant的主键,而是加入该表的另一个唯一列,{{ 1}}(其中实际上是主键,但是 shhh ,不要告诉NHibernate)。

首先,我们需要将Id的ID添加为属性。我们将其命名为Servant,以便不会隐藏我们从ServantId继承的Id属性。我们还会相应地设置Personinsertupdate以确保NHibernate允许数据库生成此值。

generated

接下来,我们修改<joined-subclass name="Servant"> <key column="Person_Id" /> <property name="ServantId" column="Id" insert="false" update="false" generated="insert" /> </class> &#39; User属性的映射,告诉它加入另一个表中的新属性而不是主键。

Servant

中提琴!上面的描述应该足以绘制图片的所有边(DB Tables,NH Mappings,C#Classes),但如果不是,请告诉我,我可以更明确。