【问题标题】: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"; }
    }
}

所以现在我不想拥有两张桌子,OrdersStatuses。 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。这样做的原因是很容易在空数据库上部署,以便在第一次请求时填充它。

  1. 如何处理字典表?
  2. 我的方法是否有我看不到的明显缺点?
  3. 我在这里看到的一个问题是,当我需要获取所有可能的状态时,我无法使用如下代码:

    session.QueryOver().List();

因为尚未创建所有状态。 那你怎么看?

【问题讨论】:

  • 一个枚举不能满足订单状态吗?

标签: c# .net nhibernate entity-framework orm


【解决方案1】:

好问题...

我认为你的 Approved-class 应该使用单例模式,因为只能有一个 Approved-state ...

所有现有状态与所有可能状态的列表有点困难......可能的状态取决于从 BaseState 继承的类......我不知道如何快速找到那些,因为它们没有驻留在当前程序集中,甚至在加载的程序集中...您应该考虑 BaseStatus 中所有子类单例对象的静态列表...

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2011-02-25
    • 2015-02-14
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多