1

私は上級のNHibernateユーザーではないので、これはいくぶん重要かもしれません、そして私はまだそれを発見していませんでした。

クラスについて考えてみましょう。

public class House
{
    public int Id { get; set; }

public ISet<Room> Rooms
{
    get;
    set;
}

}

NHibernate Set要素を指定する場合、次のように記述するだけでは不十分です。

<set name="Rooms" />

代わりに、少なくとも次のように書く必要があります。

<set name="Rooms">
  <key column="RoomId"/>
  <one-to-many class="Room"/>
</set>

これはDRYの原則に違反しているようです。Setの場合、デフォルトは1対多の関係である必要があります。クラスはコレクションのジェネリック型から推測する必要があり、キー列として、コレクション要素のクラスの主キーを使用する必要があります。

これは私には合理的なデフォルトのように思えます。それでは、なぜNHiberbateはそれについて賢くなく、これらの余分な3行を入力する必要があるのでしょうか。

4

3 に答える 3

1

なぜなら、NH がマッピングに基づいてプロキシを作成すると、アセンブリを調べて、リフレクションを介して何をする必要があるかを判断するのに時間がかかるからです。これにより、NH ファクトリの起動時間が長くなります。

これはリレーショナル マッパーのオブジェクトであることを忘れないでください。追加ノード (キー) の少なくとも 1 つが必要で、操作する必要がある DB キーが何であるかを伝える必要があります。これにより、DB へのマッピング時に必要なだけ柔軟にすることができ、デフォルトに固定化されることはありません。

DRYを壊しますか?おそらく。この場合、私は気にしますか?いいえ、そうではありません。

于 2010-02-14T15:56:31.663 に答える
0

Fluent NHibnernateを見たことがあるかもしれません。彼らの DSL は DRY に触発されています。

編集: 申し訳ありませんが、もっと注意深く読むべきでした...

あなたの例に関しては、Fluent NHibernate を使用すると、マッピングを次のように表現できます。

HasMany(x => x.Rooms);

ただし、HasMany (または一対多) の関係は IList にマップされます。これをさらにカスタマイズできるかどうかはわかりません (Fluent をデフォルトとして ISet にマップさせます)。ただし、どちらにしても、標準のマッピング宣言よりも反復が少なくなります。

マッピングを宣言するためのいくつかの例を次に示します: Fluent NHibernate Wiki

于 2009-03-12T13:48:58.603 に答える
0

ジェネリック コレクションを使用しない場合はどうなるでしょうか。私が間違っていなければ、NHibernate はバージョン 1.2 以降のジェネリックのみをサポートしています。そのため、以前のバージョンでは型推論は明らかに不可能でした。

プライマリ ID が関連テーブルの外部キーとして使用されていないレガシー DB を使用するとどうなりますか?

于 2009-03-12T13:50:18.613 に答える