代码之家  ›  专栏  ›  技术社区  ›  Mosh

从数据库加载枚举

  •  2
  • Mosh  · 技术社区  · 15 年前

    我在将.NET枚举映射到数据库表时遇到问题。假设我有一个名为status的表,其值如下:

    StatusID |名称


    1草稿

    2准备好了吗

    ...

    ...

    if (myObject.Status is Ready)
        do this
    else if (myObject.Status is Draft)
        do that...
    

    由于状态是动态加载的,所以我无法确定列表中哪个特定的状态对象表示Draft或Ready状态。

    或者,我可以使用一个枚举

    public enum Statuses
    {
        Draft, 
        Ready
    };
    

    if (myObject.Status == Statuses.Draft)
        // do something...
    

    但是,这种方法的问题是,每次用户想要修改状态列表(添加新状态或重命名现有状态)时,都必须重新编译应用程序。我们无法从数据库动态加载状态。

    有没有其他人遇到过类似的情况?有什么解决方案/模式吗?

    干杯,

    莫斯

    2 回复  |  直到 15 年前
        1
  •  1
  •   slugster Joey Cai    15 年前

    实现这一点的一种常见方法是在公共低级程序集中指定枚举,该程序集可以被任何其他程序集引用(我处理过的每个项目都有某种框架或公共程序集)。

    在枚举定义中,可以指定实际值:

    public enum Status 
    {
        None = 0,
        Draft = 1,
        Ready = 2
        ... etc ...
    }
    

    如果添加了状态值,则不要担心是否需要重新编译。如果这个状态值真的要被使用,那么无论如何你都必须添加新的代码(如果你的代码永远不会基于它来做决定,为什么你要关心一个新的状态值呢?)。所以在代码的某个地方你会有这样的东西:

    if (myObject.Status == Status.MyNewValue)
        ... carry out some action ...
    

    并且包含此代码的程序集需要重新编译,定义枚举的公共程序集也需要重新编译(以便可以从该代码所在的程序集中看到新值)。数据库人员可以创建任意多的状态值,如果您不专门使用它们,则不需要重新编译。当然,这个规则也有例外,因为枚举在默认情况下是 int 可以从数据库中读入任何状态值并将其分配给status属性,但如果在枚举定义中未显式定义该状态枚举值,则序列化将失败。

    所以长话短说:不要担心重新编译方面,只要做它-您的状态值不会经常更改:)

    另外,如果你担心 名称 在枚举值中,则可以通过将枚举值映射到资源文件中的字符串来解决,该字符串就是您在数据网格中显示的内容,或者枚举通过UI显示的任何其他地方。如果您的业务专家正在更改枚举的定义(例如“1”现在表示“就绪”,而“2”现在表示“草稿”),那么这显然是愚蠢的,他们不应该这样做-如果他们这样做了,那么您将不得不重构您的代码。

        2
  •  0
  •   Keith Bloom    15 年前

    对我来说,枚举解决方案工作得很好。向数据库添加新状态意味着应用程序在遇到它时可能还有更多的工作要做。例如,如果我添加一个 Published Deleted 状态。