为了举例,我要说我必须为我国收入服务的数据库中的“人”实体建模,而在我这个非常小的国家,一个人的名字和姓氏就足够了唯一地识别这个人。此外,收入服务的数据库不使用代理键,并且向其添加代理键将在未来10年内将该国家的GDP归零。
Persons 表有三个字段:
并且,根据我所在国家/地区的大小,该表在< FirstName , LastName >上有唯一约束。一对列。
鉴于此架构,我非常简单的 Person 类具有以下成员:
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会做以下事情:
换句话说,NHibernate首先加载密钥,然后它发出一系列SELECT来分别加载每个 Person ,并在WHERE子句中提供密钥。
如果我对写数据库不感兴趣,有没有办法告诉NHibernate它可以使用单个记录集来检索两个键和非表中的关键属性?
答案 0 :(得分:0)
IQuery.Enumerable
包含您在评论中提到的行为(首先加载键,MoveNext上的元素)
在任何情况下,NH都不是为您尝试创建的大规模处理场景而设计的。
使用原始DataReader可以获得更好的性能。