类中的数据库常量

时间:2008-12-12 21:06:28

标签: c#

如果我有一个电影表,其中包含一个int FilmTypeId字段和一个电影类型表,其中包含id和一个有意义的描述:

  • 1 - 恐怖
  • 2 - 喜剧
  • ...

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

目前我会将它们作为辅助类中的常量(不可思议的空中代码):

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

但这似乎不可维护。但是每当我使用辅助或主要实体时,我每次使用常量或额外的db调用时都希望避免数据库调用。

6 个答案:

答案 0 :(得分:6)

类型列表是固定还是更改?

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

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

然后投出。您可以使用属性(以及几行定制代码)为每个枚举项存储额外的描述。

如果列表发生变化,我可能会在应用程序的早期读取它,并将列表缓存在某个地方的查找中(可能是静态的,可能在特定的缓存中)。然后只需从缓存副本中进行查找。

您可以通过添加在两个表示之间更改的属性来进一步实现此目的。

答案 1 :(得分:4)

您可以使用强类型而无需强类型值。

class FilmType : Dictionary<int, string> {}

然后只需在app加载时加载值,就像Joel建议的那样。

如果你在编译时更关注实际值,那么你不会比枚举更好。

答案 2 :(得分:2)

我的回答是假设您要对数据库中的这些值进行显式编码。

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

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

这里需要注意的一点是,当您从该表中删除行时,某些代码可能无法访问/死亡,并且根据您实现脚本的方式,构建将会中断(这会强迫您执行此操作)删除死代码。)

答案 3 :(得分:1)

关于使用枚举...取决于枚举值表示的内容(例如IDENTITY列),我可能会向我的表中添加一个StaticIdentifier列,并使THAT字段成为查找的枚举值(适当地修改我的存储过程)取静态标识符字段而不是标识列)。标识列不可避免地在DEV,QA和PROD之间混乱,我不需要那么麻烦。

答案 4 :(得分:1)

我总是将代码查找存储在类似于此

的枚举文件中
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
}

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

答案 5 :(得分:1)

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