枚举或表格?

我正在制作一个社区维基,因为我会欣赏人们的方法而不一定是答案。

我的情况是我有很多查找类型数据字段,不会改变。 一个例子是:

每年薪水
选项:0 – 25K
选项:25K – 100K
选项:100K +

我希望通过枚举轻松获得这些选项,但也希望在DB中提供文本值,因为我将报告文本值而不是ID。 此外,由于它们是静态的,我不想调用DB。

我想在枚举和表格中重复这个,但是想听一些其他的想法。

谢谢

我认为枚举是一个坏主意。 只要给出您显示的数据类型,它就会发生变化。 最好有一个数据库表,其中包含您在应用初始化时加载的ID / Min / Max / Description字段。

对于静态项,我使用Enum和每个元素的[Description()]属性。 和T4模板重新生成枚举与构建描述(或任何你想要的)

public enum EnumSalary { [Description("0 - 25K")] Low, [Description("25K - 100K")] Mid, [Description("100K+")] High } 

并使用它

 string str = EnumSalary.Mid.Description() 

PS还为System.Enum创建了扩展

 public static string Description(this Enum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); var attributes = (DescriptionAttribute[]) fi.GetCustomAttributes(typeof(DescriptionAttribute), false ); return attributes.Length > 0 ? attributes[0].Description : value.ToString(); } 

并通过描述反向创建枚举

 public static TEnum ToDescriptionEnum(this string description) { Type enumType = typeof(TEnum); foreach (string name in Enum.GetNames(enumType)) { var enValue = Enum.Parse(enumType, name); if (Description((Enum)enValue).Equals(description)) { return (TEnum) enValue; } } throw new TargetException("The string is not a description or value of the specified enum."); } 

一种方法是编写一个格式化程序,可以将枚举转换为字符串表示forms:

 public class SalaryFormatter : IFormatProvider, ICustomFormatter { public object GetFormat(Type formatType) { return (formatType == typeof(ICustomFormatter)) ? new SalaryFormatter () : null; } public string Format(string format, object o, IFormatProvider formatProvider) { if (o.GetType().Equals(typeof(Salary))) { return o.ToString(); Salary salary = (Salary)o; switch (salary) { case Salary.Low: return "0 - 25K"; case Salary.Mid: return "25K - 100K"; case Salary.High: return "100K+"; default: return salary.ToString(); } } return o.ToString(); } } 

您像任何其他格式化程序一样使用格式化程序:

 Console.WriteLine(String.Format(new SalaryFormatter(), "Salary: {0}", salary)); 

通过格式化字符串,多种类型,本地化等,可以扩展格式化程序以支持不同的格式。

我用两个。 在Linq to SQL和EF中,您只需将列属性设置为枚举类型即可。 在其他框架中,您通常可以以某种方式将列映射到枚举属性。 您仍然可以在包含有效枚举的数据库中拥有主键表。

您也可以在数据库中使用CHECK约束来执行此操作,但这往往会将您的数据绑定到您的应用程序 – 仅查看数据库的人不一定知道每个值的含义。 因此我更喜欢混合表/枚举。

使用两者,你​​应该调查CodeDOM。 使用它,您可以编写代码生成例程,允许编译过程通过读取数据库自动生成包含这些枚举的程序集或类。 这样你就可以让数据库驱动,但每次访问枚举实例时都不会调用数据库…

看看我在这里的建议如何使用entity framework中的枚举?

本质上,我使用默认值sql脚本作为核心查找数据,ID用于其他表的FK引用,然后我使用一个简单的T4模板来生成c#的枚举。 这样,数据库是高效的,规范化的并且被正确约束,并且我的c#实体不必处理ID(魔术数字)。

它简单快捷,简单,并为我完成工作。

我使用EF4,但你不需要,可以使用这种方法与你用于实体的任何技术。

首先确保这些数据真的是静态的。 如果有任何更改,您将不得不重新编译和重新部署。

如果数据真的是静态的,我会去枚举路线。 您可以创建一个YearlySalaryEnum所有值的YearlySalaryEnum 。 对于字符串表示,我将使用带字符串值的Dictionary和YearlySalaryEnum作为Key。 字典可以作为静态类中的静态实例保存。 用法与(C#)一致:

 string highSalary = StaticValues.Salaries[YearlySalaryEnum.High]; 

由于C#不允许Enums使用字符串值,因此我建议使用带有一些静态字符串的结构。

这样,您可以维护一些Intellisense,但不要试图在数据库中的字符串值上窃取Enum值。

我将提供的另一个解决方案:删除依赖于这些值的逻辑并转移到基于表的逻辑。 (例如,如果每次跟踪具有不同的税率,请将税率添加为数据库中的列,而不是代码中的案例{}。)。

使用枚举(用于代码)和DB文本 – 用于GUI演示。

因此,如果您总是有3个选项使用枚举LowSalaryMiddleSalaryHighSalaryHighSalary文本存储在数据库中,并在GUI中切换与您的属性枚举值对应的文本。