#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. Причиной такой вещи является простое развертывание в пустой базе данных, так что она заполняется при первых запросах.
- Как вы обрабатываете словарные таблицы?
- Есть ли у моего подхода очевидные недостатки, которые я не вижу?
-
Одна из проблем, которую я вижу здесь, заключается в том, что когда мне нужно получить все возможные статусы, я не могу использовать код, подобный:
сессия.QueryOver().List();
потому что еще не все статусы могут быть созданы. Итак, что вы думаете?
Комментарии:
1. разве перечисления недостаточно для определения статуса заказа?
Ответ №1:
хороший вопрос…
я бы подумал, что ваш утвержденный класс должен использовать шаблон make use одноэлементный, поскольку может быть только одно утвержденное состояние …
список всех существующих против со всеми возможными состояниями немного сложнее… возможные состояния зависят от того, какие классы наследуются от BaseState… я понятия не имею, как быстро их найти, поскольку они не обязательно должны находиться в текущей сборке или даже в загруженной сборке … вам следует подумать о статическом списке всех объектов singleton подклассов в BaseStatus …