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

类中的数据库常量

c#
  •  6
  • NikolaiDante  · 技术社区  · 16 年前

    例如,如果我有一张电影表,上面有一个int filmtypeid字段和一张电影类型表,其中的id和有意义的描述如下:

    • 1恐怖
    • 2 -喜剧

    在C类中使用该信息的最佳方法是什么?

    目前我将它们作为一个助手类中的常量(毫不奇怪的空气代码):

    public class FilmHelper
    {
        public const int HorrorFilmType = 1;
        public const int ComedyFilmType = 2;
        ...
    }
    

    但这似乎无法维持。但我希望在每次使用常量时避免数据库调用,或者在每次使用助手或主实体时避免额外的db调用。

    6 回复  |  直到 16 年前
        1
  •  6
  •   Marc Gravell    16 年前

    类型列表是固定的还是变化的?

    如果修复,我会将其封装在枚举中:

    public enum FilmType {
       Horror = 1,
       Comedy = 2
    }
    

    那就开始吧。您可以使用属性(和几行定制代码)来存储每个枚举项的额外描述。

    如果列表发生更改,我可能会在应用程序的早期读一次,然后将列表缓存在某个查找中(可能是静态的,也可能是特定的缓存中)。然后从缓存副本进行查找。

    您可以通过添加在两个表示之间发生更改的属性来进一步了解这一点。

        2
  •  4
  •   harpo Binary Worrier    16 年前

    可以使用强类型,而不必强键入值。

    class FilmType : Dictionary<int, string> {}
    

    然后,按照Joel的建议,在应用程序加载时加载这些值。

    如果您更关心编译时的实际值,那么您不会比枚举做得更好。

        3
  •  2
  •   Austin Salonen gmlacrosse    16 年前

    我的答案假设您希望根据数据库中的这些值显式地编码。

    我过去所做的就是构建一个创建常量文件的脚本。(我还有一个SQL脚本,当使用文本输出运行时,它将输出C代码,这样我就可以将其粘贴到文件中并立即使用该常量。)

    如果您这样做,您可以将其作为持续集成构建的一部分,并在构建完成时获取该文件的最新信息。

    这里要注意的一点是,当从该表中删除行时,一些代码可能会变得不可访问/死掉,并且根据脚本的实现方式,构建将中断(这是强制您删除死掉的代码的一件好事)。

        4
  •  1
  •   Chris Marisic    16 年前

    我总是将代码查找存储在类似于此的枚举文件中

    public enum ReportStatus
    {
        [Description("Reports that are running")] Running,
        [Description("Reports that are pending to run")] Pending,
        [Description("Reports that have errored while running")] Error,
        [Description("Report completed successfully.")] Finished
    }
    

    要从枚举的描述标记中读取,我使用一个类simliar到这个示例 Monsters Got My .NET . 这使您能够灵活地同时在枚举中存储查找类型对象的ID、代码和描述。

        5
  •  1
  •   Joel Coehoorn    16 年前

    我会在应用程序启动时从数据库中提取它,或者在使用数据的任何查询中加入表。

        6
  •  1
  •   Robert C. Barth    16 年前

    关于使用枚举…根据枚举值所代表的内容(例如标识列),我可以向表中添加一个staticIdentifier列,并使该字段成为查找的枚举值(适当修改存储过程以获取静态标识符字段而不是标识列)。身份列不可避免地会在dev、qa和prod之间被搞得一团糟,我不需要这些麻烦。