如何处理数据库中的字典表

时间:2011-04-19 09:03:36

标签: 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"; }
    }
}

所以现在我不想要的是两个表,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()列表();

  4. 因为并非所有状态都可以创建。 你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

好的问题......

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

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