0

我们有一些带有遗留模式的旧表,我们发现它们很难使用。

是否可以使用 NHibernate 将其中一些数据转换为更好的模型?

例如,我们可能有一个整数状态列,我们希望将其分解为几个属性。

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

我们希望有类似的东西:

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

Status枚举在哪里)

我知道我们可以使用一个protected可以获取状态的字段,然后定义额外属性的 getter 以根据支持字段返回适当的值,但我很确定这将禁用基于这些查询的能力特性。

但是,通过这种方式,我们将无法进行诸如查询之类的查询.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 使用旧值设置一个私有变量,并拥有一个在枚举和旧值之间转换的 getter/setter。

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 回答