我们有一个遗留的数据库架构,我已经尝试(不成功)与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能够做我正在尝试的事情,有没有不同的方法来实现这一点(不改变数据库架构),或者我刚刚在我的地图文件中做了一个初学者的错误?
答案 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>