2

例として、私の国の収益サービスのデータベースの「人」エンティティをモデル化する必要があり、私の非常に小さな国では、人の名前と名前で一意に識別できるとしましょう。人。さらに、歳入サービスのデータベースは代理キーを使用せず、それに代理キーを追加すると、今後10年間は​​国のGDPがゼロになります。

Personsテーブルには3つのフィールドがあります。

  • ファーストネーム
  • 苗字
  • 現住所

そして、私の国のサイズを考えると、テーブルには< FirstNameLastName >列のペアに一意の制約があります。

このスキーマを考えると、私の非常に単純なPersonクラスには次のメンバーがあります。

  • KeyPersonKeyクラスのインスタンス。これには、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>

これまでのところ、このマッピングは正常に機能しており、DBからPersonエンティティを問題なくロードできます。

ただし、内部を見ると、セット全体をロードすると、NHibernateは次のことを実行することがわかります。

  1. レコードセットを開いて、 Personsテーブルから主要なプロパティのみ(つまり、FirstNameフィールドとLastNameフィールドのみ)をロードします。
  2. Personsからロードされた< FirstNameLastName >のペアごとに、SELECTを発行して(もちろんPersonsに対しても)、そのFirstNameLastNameを持つ人のCurrentAddressをロードします。

つまり、NHibernateは最初にキーをロードし、次に一連のSELECTを発行して、WHERE句でキーを提供する各Personを個別にロードします。

データベースへの書き込みに興味がない場合、単一のレコードセットを使用してテーブルからキープロパティと非キープロパティの両方を取得できることをNHibernateに伝える方法はありますか?

4

1 に答える 1

0

IQuery.Enumerableコメントで言及した動作があります(最初にキーをロードし、MoveNextの要素をロードします)

いずれにせよ、NH は、作成しようとしている大量処理シナリオ用に設計されていません。

生の DataReader を使用すると、パフォーマンスが大幅に向上します。

于 2011-07-26T18:36:13.350 に答える