2011-03-09 11 views
0

私たちは、扱いにくい古いスキーマを持つ古いテーブルをいくつか持っています。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で楽になるヘルパーフレームワークがありますか?

どのように他の人がこれを処理しますか?

答えて

0

独自の「列挙」クラスを作成できます。

public class Status 
{ 
    //The numeric (legacy) code 
    public int Code{ get;private set; } 
    //The human readable name 
    public string Name{ get; private set; } 
    //If this status is an active status 
    public bool IsActive { get; private set; } 

    private Status(int aCode, string aName, bool anIsActive) 
    { 
     Code = aCode; 
     Name = aName; 
     IsActive = anIsActive; 
    } 

    public static Status ACTIVE = new Status(0, "Active"); 
    public static Status INACTIVE = new Status(1, "Inactive"); 
    //Other status here... 
    private static Status[] STATUSES = {Active,Inactive,...}; 

    //Returns a status based on the passed in code 
    public static Status GetByCode(int aCode) 
    { 
     return STATUSES.FirstOrDefault(aStatus => aStatus.Code == aCode); 
    } 
} 

次に、あなたはNHibernateのは、従来の値でプライベート変数を設定していると列挙し、従来の値との間の変換ゲッター/セッターを持つことができます。 .Query(p => p.Status.Code)

+0

NHibernateのマッピングでtheLegacyStatusを使用している場合は、p.Status.Codeを照会することは動作しません:あなたはその後、NHibernateのクエリでこの列挙体を使用することができます

private int theLegacyStatus; //This is the value that NHibernate sets public Status { get { return Status.GetStatusByCode(theLegacyStatus); } set { theLegacyStatus = value.Code; } } 

。ラッピングStatusプロパティについては何も知らないので、そのようなクエリに対して生成するSQLを知ることは期待できません。 (既にこのようなものを試して、「プロパティを解決できませんでした:ステータス」のような例外が発生しました) – andreialecu

+0

基準を使用していますか?私がこのメソッドを使う方法は、 'var criteria = DetachedCriteria.F.Add(Restrictions.Eq(" theLegacyStatus ")、0);'であり、ステータスがActive(0)の 'ObjectType'オブジェクトをすべて返します。 – brainimus

+0

はい、基準を知っているか、HQLは動作しますが、それはモデルを破壊します。クエリを実行するにはエンティティの内部について知っておく必要がありますが、これは誤った設計です。私はより良い解決策を探していました。あなたの答えをありがとう。 – andreialecu

関連する問題