Преобразование старых ценностей с помощью NHibernate - PullRequest
0 голосов
/ 10 марта 2011

У нас есть несколько старых таблиц с устаревшими схемами, с которыми нам трудно работать.

Можно ли использовать 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 для достижения этой цели?

Как другие люди справляются с этим?

1 Ответ

0 голосов
/ 10 марта 2011

Вы можете создать свой собственный класс "перечисления".

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...