如果我有一个电影表,其中包含一个int FilmTypeId字段和一个电影类型表,其中包含id和一个有意义的描述:
在C#类中使用该信息的最佳方式是什么?
目前我会将它们作为辅助类中的常量(不可思议的空中代码):
public class FilmHelper
{
public const int HorrorFilmType = 1;
public const int ComedyFilmType = 2;
...
}
但这似乎不可维护。但是每当我使用辅助或主要实体时,我每次使用常量或额外的db调用时都希望避免数据库调用。
答案 0 :(得分:6)
类型列表是固定还是更改?
如果修复,我会将其封装在枚举中:
public enum FilmType {
Horror = 1,
Comedy = 2
}
然后投出。您可以使用属性(以及几行定制代码)为每个枚举项存储额外的描述。
如果列表发生变化,我可能会在应用程序的早期读取它,并将列表缓存在某个地方的查找中(可能是静态的,可能在特定的缓存中)。然后只需从缓存副本中进行查找。
您可以通过添加在两个表示之间更改的属性来进一步实现此目的。
答案 1 :(得分:4)
您可以使用强类型而无需强类型值。
class FilmType : Dictionary<int, string> {}
然后只需在app加载时加载值,就像Joel建议的那样。
如果你在编译时更关注实际值,那么你不会比枚举更好。
答案 2 :(得分:2)
我的回答是假设您要对数据库中的这些值进行显式编码。
我过去所做的是构建一个创建常量文件的脚本。 (我还有一个SQL脚本,当使用文本输出运行时会输出C#代码,所以我可以将其粘贴到文件中并立即使用该常量。)
如果您这样做,您可以将其作为持续集成构建的一部分,并在构建完成后获取该文件的最新信息。
这里需要注意的一点是,当您从该表中删除行时,某些代码可能无法访问/死亡,并且根据您实现脚本的方式,构建将会中断(这会强迫您执行此操作)删除死代码。)
答案 3 :(得分: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,代码和描述。
答案 4 :(得分:1)
我实际上是在应用程序启动时从数据库中提取它,或者在任何使用数据的查询中加入表格。
答案 5 :(得分:1)
关于使用枚举...取决于枚举值表示的内容(例如IDENTITY列),我可能会向我的表中添加一个StaticIdentifier列,并使THAT字段成为查找的枚举值(适当地修改我的存储过程)取静态标识符字段而不是标识列)。标识列不可避免地在DEV,QA和PROD之间混乱,我不需要那么麻烦。