NHibernate的。动态选择需要添加到结果集的引用

时间:2014-01-14 19:36:26

标签: c# nhibernate

我正在尝试优化对DB的查询。目前我们有这样的映射,但它可能在未来增长。我们正在对对象A执行大量小操作,并且大多数操作不需要加载所有数据。同时,为了在UI上显示数据,我们需要立即加载所有员工。

我试图添加额外的映射,但看起来这不是一个例子。

这是映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" default-lazy="false">
    <class name="A" table="A" discriminator-value="?" dynamic-update="true" >

        <cache usage="nonstrict-read-write"/>

        <id name="AId" column="aId">
            <generator class="guid.comb" />
        </id>

        <bag name="B" table="B" inverse="true" outer-join="false" lazy="false" batch-size="50" >
            <cache usage="nonstrict-read-write"/>
            <key column="aId" />
            <one-to-many class="B" />
        </bag>

        <many-to-one name="C" column="cId" class="C" outer-join="true" not-found="ignore" />
        <many-to-one name="D" column="dId" class="D" outer-join="true" not-found="ignore" />

  </class>
</hibernate-mapping>

是否可以在ICriteria中指定只检测疼痛对象A或具有任何设置内部对象B,C或D的对象A

感谢。

1 个答案:

答案 0 :(得分:1)

NHibernate确实有解决方案。实际上,这个ORM工具的设计正是这些场景所期望的。但首先,请尝试停止使用延迟映射。

换句话说,我们必须做到这一点。保持映射延迟,并强制查询 ad hoc eager 。想了解一下:

后续步骤。将所有映射更改为lazy="true" ...或跳过它,因为懒惰是默认值。不要使用default-lazy =“false”。

让所有映射都支持懒惰,我们可以在查询中覆盖该行为。所以实际上所有这些A,B,C都将在这个查询中选择一个SELECT发送到数据库引擎:

var criteria = session.CreateCriteria<A>()
    .CreateAlias("B", "b")
    .CreateCriteria("C");

我们还可以指定JOIN的类型(内部,左侧)。同时检查NHibernate - CreateCriteria vs CreateAlias。还有更多...

以下是文档中的一些起点(类似章节16 QueryOver):

一旦玩了更多(以及one-to-many / collections),也请检查: