私たちは、扱いにくい古いスキーマを持つ古いテーブルをいくつか持っています。Hibernateでレガシー値を変換する
NHibernateを使用してこのデータの一部をより良いモデルに変換できますか?
たとえば、いくつかのプロパティに分解する整数のステータス列があるとします。
Legacy status: 0 - Active, 1 - Inactive, 2 - TemporarilyInactive, 3 - etc
私たちのようなものを持ちたいと思い
:
bool IsActive { get; set; }
Status Status { get; set; }
私たちは、その後の状態を取ることができprotected
フィールドを使用することができることを知って
(Status
は列挙型である場合)バッキングフィールドに基づいて適切な値を返すために追加のプロパティのゲッターを定義しますが、これらのプロパティに基づいてクエリを行う機能が無効になることは間違いありません。
これにより、.Query(p => p.IsActive)
などのクエリを実行できず、where status = 0
などのSQLに変換されますか?
唯一の方法はカスタムIUserTypes
ですか?もしそうなら、これを達成するためにIUserType
で楽になるヘルパーフレームワークがありますか?
どのように他の人がこれを処理しますか?
NHibernateのマッピングでtheLegacyStatusを使用している場合は、p.Status.Codeを照会することは動作しません:あなたはその後、NHibernateのクエリでこの列挙体を使用することができます
。ラッピングStatusプロパティについては何も知らないので、そのようなクエリに対して生成するSQLを知ることは期待できません。 (既にこのようなものを試して、「プロパティを解決できませんでした:ステータス」のような例外が発生しました) – andreialecu
基準を使用していますか?私がこのメソッドを使う方法は、 'var criteria = DetachedCriteria.F.Add(Restrictions.Eq(" theLegacyStatus ")、0);'であり、ステータスがActive(0)の 'ObjectType'オブジェクトをすべて返します。 –
brainimus
はい、基準を知っているか、HQLは動作しますが、それはモデルを破壊します。クエリを実行するにはエンティティの内部について知っておく必要がありますが、これは誤った設計です。私はより良い解決策を探していました。あなたの答えをありがとう。 – andreialecu