Как обрабатывать словарные таблицы в базе данных

#c# #.net #nhibernate #entity-framework #orm

#c# #.net #nhibernate #entity-framework #orm

Вопрос:

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

 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. Одна из проблем, которую я вижу здесь, заключается в том, что когда мне нужно получить все возможные статусы, я не могу использовать код, подобный:

    сессия.QueryOver().List();

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

Комментарии:

1. разве перечисления недостаточно для определения статуса заказа?

Ответ №1:

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

я бы подумал, что ваш утвержденный класс должен использовать шаблон make use одноэлементный, поскольку может быть только одно утвержденное состояние …

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