如何处理数据库中的字典表
Posted
技术标签:
【中文标题】如何处理数据库中的字典表【英文标题】:How to handle dictionary tables in data base 【发布时间】:2011-04-19 09:03:36 【问题描述】:例如我有以下领域模型:
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
。 Orders 表将有 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();
因为尚未创建所有状态。 那你怎么看?
【问题讨论】:
一个枚举不能满足订单状态吗? 【参考方案1】:好问题...
我认为你的 Approved-class 应该使用单例模式,因为只能有一个 Approved-state ...
所有现有状态与所有可能状态的列表有点困难......可能的状态取决于从 BaseState 继承的类......我不知道如何快速找到那些,因为它们没有驻留在当前程序集中,甚至在加载的程序集中...您应该考虑 BaseStatus 中所有子类单例对象的静态列表...
【讨论】:
以上是关于如何处理数据库中的字典表的主要内容,如果未能解决你的问题,请参考以下文章