您是否在数据应用程序中使用枚举以及如何使用枚举?

时间:2010-05-23 15:45:19

标签: c# sql linq orm enums

我的实践表明,一般企业应用程序有很多实体,其性质对应于基本枚举。例如,我们可能有一个Order实体,它可能包含“OrderType”,“OrderStatus”,“Currency”等字段,引用相应的实体,这些实体只不过是一个绑定到要引用的键的文本名称。

使用枚举在这里看起来很自然。但实体必须在设计时在应用程序代码中定义,我是对的吗?虽然我们需要能够在运行时使用CRUD枚举值变体,并在服务器端SQL查询中使用枚举(如存储过程和视图)。

你对这个问题的做法和想法是什么?

我对C#4,linq和T-SQL特别感兴趣。

2 个答案:

答案 0 :(得分:2)

我将枚举用于数据库值,这些数据库值永远不应由用户创建或更改,并且如果存在基于该值的特殊逻辑。货币不是一个很好的例子,除非您的枚举中包含所有货币并接受如果新货币出现或者不推荐使用新货币,您将不得不重新编译应用程序。如果您的系统中有基于OrderStatus的逻辑,OrderStatus可能是一个很好的示例。无论如何,应该注意的是,如果您确实创建了一个枚举来表示数据库值,那么必须重新编译应用程序,如果需要创建此表中的新值,那么应该非常谨慎地使用此实践。

在我要使用枚举模仿数据库值的情况下,我使用枚举值的名称作为表的主键,并将值作为传递给外键的值。即,当我保存到数据库时,我将通过myEnumVal.ToString()。我有几个原因。首先,它要求更加慎重地添加值。如果我使用数值作为主键,则意味着我正在使用代理键,并且可以轻松添加其他值。当其他开发人员看到使用名称作为主键的列时,他们认为该值不是任意的的可能性更高。其次,它使数据库代码更容易阅读。您会收到Where OrderStatus = 'Active'而非Where OrderStatus = 1的查询。

答案 1 :(得分:1)

在某种意义上,C#枚举类似于面向对象的类层次结构。如果使用替代ChoiceOne声明枚举Two,则有点类似于声明具有基类Choice的类层次结构和两个派生类型({{1} }和One : Choice)。

  • 一个区别是枚举不可扩展(如果需要添加一个案例,则需要修改声明,而如果需要将一个案例添加到类层次结构中,则只需定义一个新的继承类型)。

  • 第二个区别是枚举的选项不能携带额外的数据 - 如果您要声明类层次结构,则可以在Two : Choice的情况下存储其他字段(例如)。

    < / LI>

如果没有这两个“限制”,您可以考虑使用枚举来表示应用程序中的实体(事实上,函数式语言的构造类似于这些“更强大”的枚举,并将其用于这些事情)。

但是,由于C#枚举非常简单,因此它们主要用于表示独立于特定域的值,或者在编程中更常用的值。例如:

One

这可能是非常有用的类型,但它与任何特定域都没有直接关系。