В качестве примера предположим, что мне нужно смоделировать сущность "человек" в базе данных налоговой службы моей страны, и что в моей очень маленькой стране достаточно имени и фамилии человекауникально идентифицировать человека.Кроме того, база данных налоговой службы не использует суррогатные ключи, и добавление к ней суррогатного ключа приведет к обнулению ВВП страны в течение следующих 10 лет.
В таблице Персоны есть три поля:
И, учитывая размер моей страны, таблица имеет ограничение уникальное для <<em> 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 делает следующее:
- Открывает набор записей только для загрузки ключевых свойств (т.е. исключительно поля FirstName и LastName ) из таблицы Persons ;
- Для каждого <<em> FirstName , LastName > пара, загруженная из Persons , выдает SELECT - конечно, также против Persons - для загрузки CurrentAddress для человека, имеющего FirstName и LastName .
Другими словами, NHibernate сначала загружает ключи, а затем выдает серию SELECT для загрузки каждого Person отдельно, обеспечиваяключ в предложении WHERE.
При условии, что я не заинтересован в записи в базу данных, есть ли способ сообщить NHibernate, что он может использовать один набор записей для извлечения ключа и несвойства из таблицы?