NHibernate выдает избыточные запросы с помощью составных ключей - PullRequest
2 голосов
/ 26 июля 2011

В качестве примера предположим, что мне нужно смоделировать сущность "человек" в базе данных налоговой службы моей страны, и что в моей очень маленькой стране достаточно имени и фамилии человекауникально идентифицировать человека.Кроме того, база данных налоговой службы не использует суррогатные ключи, и добавление к ней суррогатного ключа приведет к обнулению ВВП страны в течение следующих 10 лет.

В таблице Персоны есть три поля:

  • Имя
  • Имя
  • CurrentAddress

И, учитывая размер моей страны, таблица имеет ограничение уникальное для <<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 делает следующее:

  1. Открывает набор записей только для загрузки ключевых свойств (т.е. исключительно поля FirstName и LastName ) из таблицы Persons ;
  2. Для каждого <<em> FirstName , LastName > пара, загруженная из Persons , выдает SELECT - конечно, также против Persons - для загрузки CurrentAddress для человека, имеющего FirstName и LastName .

Другими словами, NHibernate сначала загружает ключи, а затем выдает серию SELECT для загрузки каждого Person отдельно, обеспечиваяключ в предложении WHERE.

При условии, что я не заинтересован в записи в базу данных, есть ли способ сообщить NHibernate, что он может использовать один набор записей для извлечения ключа и несвойства из таблицы?

1 Ответ

0 голосов
/ 26 июля 2011

IQuery.Enumerable имеет поведение, которое вы упомянули в комментарии (сначала загружаются ключи, элементы на MoveNext)

В любом случае NH не предназначен для сценария массовой обработки, который вы пытаетесь создать.

Вы получите гораздо лучшую производительность, если будете использовать необработанный DataReader.

...