1

NHibernate でデータベースへのラウンドリップなしで、定義済みのルックアップをいくつか使用したいと考えています。

基本的には、次のようなコードが必要です。

public class Countries
{
  static Countries() {
    Australia = new Country
      {
          Id = 14,
          Description = "Australia"
      }
  }
  public static Country Austrlia { get; protected set }
}

次に、このコード スニペットを記述します。

address.Country = Countries.Australia;// Snippet1
if (address.Country == Countries.Australia) { // Snippet2
  // Do something
}

そのため、Equals、GetHashCode をオーバーライドし、Country クラス ルックアップの演算子 == と != をオーバーロードします。

Snippet1 は、指定された ID を持つ国がメモリに読み込まれていない場合にのみ機能します。それ以外の場合は、指定された ID を持つオブジェクトが既にメモリ内にあることを示す NonUniqueObjectException がスローされます。

これを回避するには、読み込まれた国を立ち退かせてから、ルックアップ値を割り当てる必要があります。これは間違っているように感じます。Country ルックアップのクエリが再度実行されたときに何が起こるかわかりません。

問題は、NHibernate で静的ルックアップ クラスを維持する方法です。

ありがとう、ドミトリー。

4

2 に答える 2

2

列挙型クラスと呼ばれるものを確認してください..

基本的にフライ級のパターンです。

IUserType実装を使用して、値または表示名として永続化できます。

私たちは彼らとクレイジーなことをします。同様に、すべての値をコードに保持しながら、DBA 担当者に外部キーを使用して自動生成されたルックアップ テーブルを提供します。

于 2009-08-01T03:16:12.290 に答える
1

NHibernate は論理的に同じ (ただし異なるインスタンス) 2 つのオブジェクトを処理できないようです。
そのため、「静的ルックアップ」とデータベース ルックアップを混在させるのではなく、どちらか一方のみを使用することをお勧めします。

私の場合 - データベースに保存されたルックアップ。ただし、オブジェクトを取得するためだけにデータベースへのラウンドトリップを回避するには、Get の代わりに Load を使用するだけで済みます。

address.Country = Session.Load<Country>(CountryIds.Australia); // This does not hit DB
address.Country = Session.Get<Country>(CountryIds.Australia); // This DOES hit DB
于 2009-08-07T07:14:55.013 に答える