2

为了这个例子,假设我必须为我国税收服务数据库的“人”实体建模,而在我这个很小的国家,一个人的名字和姓氏足以唯一标识此人。此外,税收服务的数据库不使用代理键,添加代理键将使该国未来 10 年的 GDP 归零。

Persons表包含三个字段:

  • 目前的地址

而且,考虑到我所在国家/地区的规模,该表对 < FirstName , LastName > 列对具有唯一约束。

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

  • KeyPersonKey类的实例,它又具有FirstNameLastName成员,当然实现了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表中加载关键属性(即仅FirstNameLastName字段) ;
  2. 对于从Persons加载的每个 < FirstName , LastName > 对,它发出一个 SELECT - 当然也针对Persons - 为具有该FirstNameLastName的人加载 CurrentAddress 。

换句话说,NHibernate 首先加载键,然后发出一系列 SELECT 来分别加载每个Person,在 WHERE 子句中提供键。

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

4

1 回答 1

0

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

在任何情况下,NH 都不是为您尝试创建的批量处理方案而设计的。

通过使用原始 DataReader,您将获得更好的性能。

于 2011-07-26T18:36:13.350 回答