是否可以在Nhibernate中导航复合ID的多对多关键?
我有一些(遗留)表格,我使用以下设置进行映射:
<class name="StructureUser">
<composite-id>
<key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
<key-many-to-one name="User" class="User" column="USERID" />
</composite-id>
...
</class>
<class name="Structure">
<id name="Id" column="id" type="Int32" >
<generator class="native"/>
</id>
<property name="Low" column="low" type="Int32" />
...
</class>
我想通过查询中的StructureUser类访问Structure的“Low”属性。我尝试了我能想到的Criteria API的每一种用法,但总是出错。以下是我尝试的两个查询:
ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
.CreateAlias("Structure", "struc")
.Add(Restrictions.Le("struc.Low", 123));
ICriteria crit2 = Session.CreateCriteria(typeof(StructureUser))
.Add(Restrictions.Le("Structure.Low", 123));
crit1中的错误来自数据库并且说“struc_1.Low在此上下文中无效”,因为NHibernate不会在sql命令中生成限制所需的连接。 crit2中的错误来自NHibernate,告诉我它无法访问StructureUser上的“Structure.Low”属性。
我通过使用key-property元素声明composite-id并声明与普通多对一元素的关系来解决这个问题。
这个问题有另一个解决方案吗?
答案 0 :(得分:0)
你试过吗
ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
.CreateCriteria("Structure", "struc")
.Add(Restrictions.Le("struc.Low", 123));
答案 1 :(得分:0)
我遇到了类似的问题。
正如原始海报所说,您需要在要复合的复合键的元素上添加多对一关系,并且需要设置属性&#34; insert&#34;和&#34;更新&#34;到&#34; false&#34; 。
然后你可以把它保存在composite-id中,你不需要把它改成一个key-property元素。
<class name="StructureUser">
<composite-id>
<key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
<key-many-to-one name="User" class="User" column="USERID" />
</composite-id>
<many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" insert="false" update="false" />
...