2009-09-17 39 views
1

让我们假设我有两个表Nhibernate:基于多个键的一对多?

Table tA 
    ID 
    ID2 
    SomeColumns 
Table tB 
    ID 
    ID2 
    SomeOtherColumns 

我希望创造一个对象,让我们把它叫做对象A(基于TA),这将有一个一对多的关系,对象B(基于TB)。在我的例子中,我需要使用ID和ID2的组合作为外键。如果我正在编写SQL,它看起来像这样:

从tA选择tB。* ,tB 其中tA.ID = tB.ID和tA.ID2 = tB.ID2;

我知道对于tA中的每个ID/ID2组合,我应该在tB中有许多行 ,因此我知道这是一对多组合。很明显,以下设置对于这样的映射是不够的,因为它仅考虑一个关键。

<set name="A2" table="A2" generic="true" inverse="true" > 
    <key column="ID" /> 
    <one-to-many class="A2" /> 
</set> 

谢谢!

+0

我张贴了类似的问题: http://stackoverflow.com/questions/5589505/nhibernate-join-filter-with-clause 如果你有一个想法,或者你已经解决了你的帖子,让我知道如果你有任何关于我的想法...我会很感激任何帮助! 谢谢 – Akrion 2011-04-08 18:34:41

回答

0

我正在寻找解决这个完全相同的问题。看起来好像一对多关系只能在映射中指定一个列。必须有一些解决方法...

2

你试过吗?

<set name="A2" table="A2" generic="true" inverse="true" > 
    <key> 
    <column ="ID" /> 
    <column ="ID2" /> 
    </key> 
    <one-to-many class="A2" /> 
</set> 
0

对我来说,这听起来像是你附错了问题。建议的表格结构显然违反关系dbs的标准化原则。如果表tA中ID/ID2的组合在tB中有很多相关记录,那么您必须在tA中有替代主键,这将从tB引用(因此tB根本不会有Id,ID2列)。

如上所述,一旦表格被规范化,nhibernate映射就像EntityA上的Many-to-One或EntityB上的One-To-Many集合映射一样简单(取决于域中这两个实体之间的关系方向) 。毕竟它是驱动它的域而不是数据库结构。