0

作業が難しい古いスキーマを持つ古いテーブルがいくつかあります。

NHibernate を使用して、このデータの一部をより適切なモデルに変換することは可能ですか?

たとえば、いくつかのプロパティに分割したい整数のステータス列があるとします。

Legacy status: 0 - Active, 1 - Inactive, 2 - TemporarilyInactive, 3 - etc

次のようなものが必要です。

bool IsActive { get; set; }
Status Status { get; set; }

Status列挙型はどこにありますか)

protectedステータスを取得できるフィールドを使用し、追加のプロパティのゲッターを定義して、バッキング フィールドに基づいて適切な値を返すことができることはわかっていますが、これにより、これらに基づいてクエリを実行する機能が無効になると確信しています。プロパティ。

ただし、これでは、 などのクエリを実行して.Query(p => p.IsActive)、それを などの SQL に変換することはできませんwhere status = 0よね?

カスタムを介して唯一の方法IUserTypesですか?IUserTypeもしそうなら、これを達成するために簡単に作業できるヘルパーフレームワークはありますか?

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

4

1 に答える 1

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 にレガシー値でプライベート変数を設定させ、列挙とレガシー値の間で変換するゲッター/セッターを持たせることができます。

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

その後、NHibernate クエリでこの列挙を使用できます。.Query(p => p.Status.Code)

于 2011-03-10T03:08:13.953 に答える