Например, у меня есть следующая модель домена:
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. Причиной такой вещи является простота развертывания в пустой базе данных, чтобы она заполнялась при первых запросах.
- Как вы справляетесь со словарными таблицами?
- У моего подхода есть очевидные недостатки, которые я не вижу?
Одна проблема, которую я вижу здесь, это когда мне нужно получить все возможные статусы, я не могу использовать такой код:
session.QueryOver () List ();.
потому что еще не все статусы могут быть созданы.
Так что ты думаешь?