Как обрабатывать словарные таблицы в базе данных - PullRequest
2 голосов
/ 19 апреля 2011

Например, у меня есть следующая модель домена:

class Order {
    public virtual int Id {get; protected set;}
    public virtual BaseStatus Status {get; set;}
}

abstract class BaseStatus {
    public virtual int Id {get; protected set;}
    public abstract string Name {get;}
}

class Approved : BaseStatus {
    public override string Name 
    { 
          get { return "Approved"; }
    }
}

Так что теперь я не хочу иметь две таблицы, Orders и Statuses. Где таблица заказов будет иметь столбец StatusId. Вопрос об API изменения статуса заказа. Если я сделаю следующее:

order.Status = new Approved();

Это приведет к созданию новой строки в таблице статусов. В настоящее время я создал следующий помощник:

class StatusesFactory {
    ISession session;                

    public StatusesFactory(ISession session){
        this.session = session;
    }

    public GetStatus<T> where T : BaseStatus, new() {
         T status = session.QueryOver<T>.SingleOrDefault();

         if(status == null){
              status = new T();
              session.SaveOrUpdate(status);
         }

         return status;
    }
}

И когда я хочу установить статус, я использую такой код:

order.Status = statusesFactory.GetStatus<Approved>();

Кажется, это работает нормально, но сложно, без причины. Я использую NHibernate, но я думаю, что тот же вопрос может быть применен к любому ORM. Причиной такой вещи является простота развертывания в пустой базе данных, чтобы она заполнялась при первых запросах.

  1. Как вы справляетесь со словарными таблицами?
  2. У моего подхода есть очевидные недостатки, которые я не вижу?
  3. Одна проблема, которую я вижу здесь, это когда мне нужно получить все возможные статусы, я не могу использовать такой код:

    session.QueryOver () List ();.

потому что еще не все статусы могут быть созданы. Так что ты думаешь?

1 Ответ

1 голос
/ 19 апреля 2011

хороший вопрос ...

Я думаю, что ваш одобренный класс должен использовать шаблон синглтона, поскольку может быть только одно одобренное состояние ...

список всех существующих и всех возможных состояний немного сложнее ... возможные состояния зависят от того, какие классы наследуют от BaseState ... я понятия не имею, как найти их быстро, так как у них нет чтобы находиться в текущей сборке или даже в загруженной сборке ... вам следует подумать о статическом списке всех одноэлементных объектов подклассов в BaseStatus ...

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