2012-02-21 30 views
1

我正面临以下情况。用NHibernate,Bag和Enumerable.Any()生成SQL的错误?

我objectmodel如下:

EntityA --*> EntityB -> EntityC 

EntityA引用的EntityB列表。 EntityB引用单个EntityC

我的映射是:

<class name="EntityA" table="TAB_A" > 
    <id name="Id" column="A_ID" > 
     <generator class="native" /> 
    </id> 
    <version name="Version" column="VERSION" /> 
    <bag name="listOfB" cascade="save-update" table="A_TO_C" lazy="false" > 
     <key column="FK_A_ID" /> 

     <composite-element class="EntityB" > 
     <many-to-one name="refToC" class="EntityC" column="FK_C_ID" cascade="save-update" /> 
     </composite-element> 
    </bag> 
    </class> 

我离开了所有的额外属性和东西。

我查询数据库:

var query = session.Query<EntityA>() 
        .Where(a=> a.listOfB.Any(b => b.refToC == anInstanceOfC)); 

// count all matches 
var count = query.ToFutureValue(t => t.Count()); 

好吧,这看起来不错,我至今)。当我执行查询时,出现错误,SQL语句失败。生成的SQL包含以下子声明:

select listOfB1_.A_ID 
from A_TO_C listOfB1_ 
where a0_.A_ID=listOfB1_.FK_A_ID 
and listOfB1_.FK_C_ID=? 

声明预计,上表A_TO_C(实际上是TAB_A的id列的列名)列A_ID。它应该做的是选择listOfBl_.FK_A_ID列,这是引用TAB_A的A_ID列的外键列。

现在的问题:我错了还是SQL生成器?

+0

你有表A为其他拖车也次级键或外键主键的设置,表A是主键 – MethodMan 2012-02-21 19:12:21

+0

其实我不在乎:D。但NHibernate为TAB_A生成主键A_ID,为TAB_C生成C_ID。外键在列FK_A_ID和FK_C_ID上定义。这符合我的预期。 – BaSche 2012-02-21 19:56:00

回答