为了这个例子,假设我必须为我国税收服务数据库的“人”实体建模,而在我这个很小的国家,一个人的名字和姓氏足以唯一标识此人。此外,税收服务的数据库不使用代理键,添加代理键将使该国未来 10 年的 GDP 归零。
Persons表包含三个字段:
- 名
- 姓
- 目前的地址
而且,考虑到我所在国家/地区的规模,该表对 < 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 执行以下操作:
- 打开记录集以仅从Persons表中加载关键属性(即仅FirstName和LastName字段) ;
- 对于从Persons加载的每个 < FirstName , LastName > 对,它发出一个 SELECT - 当然也针对Persons - 为具有该FirstName和LastName的人加载 CurrentAddress 。
换句话说,NHibernate 首先加载键,然后发出一系列 SELECT 来分别加载每个Person,在 WHERE 子句中提供键。
如果我对写入数据库不感兴趣,有没有办法告诉 NHibernate 它可以使用单个记录集从表中检索键和非键属性?