我可以将两个表“连接”到一个类中,同时使用NHibernate创建多对一关系吗?

时间:2009-05-20 16:49:56

标签: nhibernate

我们有一个遗留的数据库架构,我已经尝试(不成功)与NHibernate进行映射。举一个简单的例子,假设我想要一个Person类,其名字来自“Person”表,但它们的姓氏来自“Person2”表。 “人物”表也有人的车的ID,我希望我的Person类拥有Car属性。我可以使用以下内容映射所有内容;

<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <class name="NHibernateMappingTest.Person, NHibernateMappingTest" lazy="false">
    <id name="Id" >
      <generator class="native" />
    </id>
    <property name="FirstName" />
    <many-to-one name="Car" access="property" class="NHibernateMappingTest.Car, NHibernateMappingTest" column="CarId"  cascade="save-update"/>
    <join table="Person2">
      <key column="PersonId" />
      <property name="LastName" />
    </join>
  </class>
</hibernate-mapping>

让我结合使用Person和Person2表,让我找到他们的车 - 一切正常。

但是......如果Person2表碰巧有人的HouseId,我希望能够在我的映射中添加第二个元素......

<many-to-one name="House" access="property" class="NHibernateMappingTest.House, NHibernateMappingTest" column="HouseId" cascade="save-update"/>

...以便我的Person类可以拥有House属性。

然而,这一切都出错了,因为NHibernate生成的SQL假定HouseId列在Person表中(但它不是,它在Person2中),所以我得到以下错误;

MySql.Data.MySqlClient.MySqlException:#42S22未知列''字段列表'中的'HouseId'

NHibernate能够做我正在尝试的事情,有没有不同的方法来实现这一点(不改变数据库架构),或者我刚刚在我的地图文件中做了一个初学者的错误?

1 个答案:

答案 0 :(得分:1)

文森特 - 感谢您的回复。不,我没有将标签元素嵌套在元素中。但是根据你的建议,我尝试过它完美无缺!非常感谢您的回复。

<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
      <class name="NHibernateMappingTest.Person, NHibernateMappingTest" lazy="false">
        <id name="Id" >
          <generator class="native" />
        </id>
        <property name="FirstName" />
        <many-to-one name="Car" access="property" class="NHibernateMappingTest.Car, NHibernateMappingTest" column="CarId"  cascade="save-update"/>
        <join table="Person2">
          <key column="PersonId" />
          <property name="LastName" />
          <many-to-one name="House" access="property" class="NHibernateMappingTest.House, NHibernateMappingTest" column="HouseId" cascade="save-update"/>
        </join>
      </class>
    </hibernate-mapping>