2013-01-16 17 views
2

一对一的关系给定的表:NHibernate的地图与中间表

TableA 
aId 
... 

TableB 
bId 
... 

TableC 
aId 
cId // Maps to TableB.bId 

换句话说表A表B和仅通过在表C中的条目相关。

我想下面的类:

public class ClassA 
{ 
    aId 
    ... 
} 

public class ClassB 
{ 
    bId 
    ... 
} 

public class ClassD : ClassA 
{ 
    ClassB 
} 

使D类拥有所有ClassA的,并添加ClassB的单个实例的属性。

我最初的想法是使用:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping auto-import="false" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="ClassD" lazy="false" table="TableA" polymorphism="explicit"> 
    <id name="aId" column="aId" type="Guid"> 
     <generator class="CustomGuidGenerator" /> 
    </id> 
    ... 
    <many-to-one name="ClassB" column="cId" class="ClassB" cascade="all" not-found="ignore" /> 
    </class> 
</hibernate-mapping> 

显然,在这种映射关系,所以在表A没有CID也没有办法在许多到一个指定的表。那么,如何通过中间连接表映射单个实体?

回答

1

不知道究竟是什么在你的表(是TableC.aId到TableA.aId参考?),但也许你可以去表每个子类战略(见例如http://docs.huihoo.com/hibernate/nhibernate-reference-1.2.0/inheritance.html

<class name="ClassA" table="TableA"> 
    <id name="aId" column="aId" type="Guid"> 
    <generator class="CustomGuidGenerator" /> 
    </id>   
    <joined-subclass name="ClassD" table="TableC"> 
     <key column="aId"/> 
     <many-to-one name="ClassB" column="cId" class="ClassB" cascade="all" not-found="ignore" /> 
    </joined-subclass> 
</class> 

关于ClassB,它应该有它自己的映射文件,系统将能够计算多对一的属性的表名(TableB)。

+0

对不起,如果我不清楚。是的,TableC.aId是对TableA.aId的引用。 ClassB确实有它自己的映射文件。 我真的很接近这个......我想。只需要做更多的测试。 –

+0

终于搞定了!谢谢! –

+0

@jbl很好的解决方案。真的,我没看到它! +;) –