我有两个实体,C和P. C以一对一的关联映射到P,lazy =“no-proxy”, 像这样:( P的映射:)
<one-to-one name="c" class="C" property-ref="P" access="field" lazy="no-proxy"/>
P以多对一关联映射到C,如下所示:(C的映射:)
<many-to-one name="p" column="PId" class="P" access="field" lazy="no-proxy" not-null="false"/>
通常我使用延迟抓取,但在某些情况下我使用FetchMode.Join来避免N + 1 SELECTs问题,如下所示:
criteria.SetFetchMode("p", FetchMode.Join)
但是,对于C实体使用FetchMode.Join执行带有左外连接的查询,然后立即执行N次查询,按ID获取P! (描述NHProf礼貌)
知道为什么会这样吗?
回答@KLE的问题,这里摘自文档here
对于主键关联,请添加 以下映射到Employee和 人分别:
<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>
确保PERSON和EMPLOYEE表中相关行的主键相等。 或者,带有一个外键 唯一约束,从员工到 人,可以表示为:
<many-to-one name="person" class="Person" column="PERSON_ID" > unique="true"/>
可以进行此关联 双向添加以下内容 到人物映射:
<one-to-one name="employee" class="Employee" property-ref="person"/>
如果我误解了这个,请告诉我。感谢。
答案 0 :(得分:0)
不知道你使用的是哪个版本的NHibernate但是2.1.0 - 2.1.2我有一些关于FetchModes和复杂映射的问题。我没有碰到property-ref
(显然混淆了属性步行者)但我确实遇到了一些联盟类的问题。
您是否尝试过设置lazy="true" / "extra"
,然后定义FetchMode.Join
?