NHibernate使用复合键发出冗余查询

时间:2011-07-26 10:23:43

标签: nhibernate composite-key composite-id

为了举例,我要说我必须为我国收入服务的数据库中的“人”实体建模,而在我这个非常小的国家,一个人的名字和姓氏就足够了唯一地识别这个人。此外,收入服务的数据库不使用代理键,并且向其添加代理键将在未来10年内将该国家的GDP归零。

Persons 表有三个字段:

  • 名字
  • CurrentAddress

并且,根据我所在国家/地区的大小,该表在< FirstName LastName >上有唯一约束。一对列。

鉴于此架构,我非常简单的 Person 类具有以下成员:

  • Key PersonKey 类的一个实例,该类又包含 FirstName LastName 成员,以及当然实现 Equals() GetHashCode();
  • CurrentAddress :一个简单的字符串。

NHibernate映射如下所示:

<class name="Person" table="Persons" lazy="false">    

  <composite-id name="Key" class="PersonKey">
    <key-property name="FirstName" type="string" column="FirstName"/>
    <key-property name="LastName" type="string" column="LastName"/>
  </composite-id>

  <property name="CurrentAddress" type="string" column="CurrentAddress" not-null="true" />

</class>

到目前为止,这个映射工作正常,我可以很高兴地从数据库中加载 Person 实体。

然而,当我深入了解时,我可以看到,在加载整个人群时,NHibernate会做以下事情:

  1. 打开一个记录集,仅从 Persons 表中加载关键属性(即仅限 FirstName LastName 字段);
  2. 对于每个&lt; FirstName LastName &gt;从 Persons 加载的对,它会发出一个SELECT - 当然也是针对 Persons - 为具有 FirstName 和<的人加载CurrentAddress EM>名字
  3. 换句话说,NHibernate首先加载密钥,然后它发出一系列SELECT来分别加载每个 Person ,并在WHERE子句中提供密钥。

    如果我对数据库不感兴趣,有没有办法告诉NHibernate它可以使用单个记录集来检索两个键和非表中的关键属性?

1 个答案:

答案 0 :(得分:0)

IQuery.Enumerable包含您在评论中提到的行为(首先加载键,MoveNext上的元素)

在任何情况下,NH都不是为您尝试创建的大规模处理场景而设计的。

使用原始DataReader可以获得更好的性能。