質問
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で静的ルックアップクラスを維持する方法は?
ありがとう、 ドミトリー。
解決 2
NHibernateは2つのオブジェクトを論理的に同じ(ただし異なるインスタンス)で処理できないようです。
したがって、「静的検索」を混在させる代わりに、データベース検索では、そのうちの1つのみを使用することをお勧めします。
私の場合-データベースに保存されたルックアップ。ただし、オブジェクトを取得するためだけにデータベースへのラウンドトリップを回避するには、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
他のヒント
列挙クラス ..
基本的には flyweight パターンです。
値または表示名として、 IUserType
実装を使用して、これらを永続化できます。
私たちは彼らと一緒にクレイジーなことをしています。コード内のすべての値を保持しながら、DBAの人々に外部キーを持つ自動生成ルックアップテーブルを提供するように。