2009-10-13 173 views
3

我有两张表,Vehicle和Make。这两个是使用MakeId作为车辆表上的外键加入的。我的映射文件类似于这样NHibernate映射外键

<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
     <class name="Demo.Business.Objects.Vehicle, Demo.Business.Objects" table="Vehicle" > 
     <id name="VehicleId" type="int" > 
      <generator class="native" /> 
     </id> 
     <property name="RegNumber" type="String" /> 
     <property name="VehicleId" type="int" /> 
     <property name="CustomerId" type="int" /> 

     <join table="Make" fetch="join"> 

      <key column="MakeId" foreign-key="MakeId"/> 
      <property name="Description" type="String" /> 
     </join> 
     </class> 
    </hibernate-mapping> 

我还以为这将加入两个表上厂名标识,但该IOS产生尝试的SQL以下连接:vehicle.vehicleid = make.makeid.

我怎样才能得到这工作?即我预计:

select * from Vehicle 
    inner join Make on Make.MakeId = Vehicle.Make Id 
+0

道歉,StackOverflow剪掉了其余的映射文件。剩下的是对Vehicle表的认可,并且工作正常,它只是使我看起来无法排序的连接。 – januszstabik 2009-10-13 14:24:01

+0

我使用StackOverflow语法编辑了您的问题,以便所有内容都显示出来,并且格式良好且颜色也很好:-) – KLE 2009-10-13 14:42:59

回答

0

你需要以不同的方式映射制作类:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Demo.Business.Objects.Vehicle, Demo.Business.Objects" table="Vehicle" > 
    <id name="VehicleId" type="int" > 
     <generator class="native" /> 
    </id> 
    <property name="RegNumber" type="String" /> 
    <property name="VehicleId" type="int" /> 
    <property name="CustomerId" type="int" /> 
    <many-to-one name="Make" column="MakeId"/> 
    </class> 
    <class name="(blahblah).Make, blahblah"> 
    <id name="MakeId" type="int"> 
     <generator class="native" /> 
    </id> 

    <property name="Description" type="String" /> 
    </class> 
</hibernate-mapping> 

你的“汽车”类的类型应该作的一作出财产。

+1

我已经使用过它了。这给了Vehicle一个Make对象的属性(不幸的是,Make表格也与外键连接在一起,我不想要一个可怕的深对象图)。客户端需要支持传统应用程序时,我无法更改数据库的架构。因此,我想实现的更像是一个“视图”,从而检索连接表中所有适当的列。这将非常像EF中的聚合表。 – januszstabik 2009-10-13 15:00:38

+0

nhibernate多对一关系在默认情况下是懒惰的,所以除非另有指定,否则不会提取对象图。 – 2009-10-13 16:14:54

+0

我可以解决加载问题,这很好。数据库的模式非常规范化,这意味着我的对象图形可能是5-6个对象深度,这意味着要使用像object1.object2.object3.object4.object5.object6.Name这样的语法。我不确定客户是否会喜欢这个,所以想在我说不能完成之前找到解决方案。 – januszstabik 2009-10-14 10:00:28