同步参照完整性表和枚举

时间:2009-07-22 20:09:03

标签: c# database enums referential-integrity

我不时地思考这个问题,所以我想我会问你们这个问题。

假设我有一个如下所示的数据库表:

Table: Visibility
Id   Value
--   -----
 0   Visible
 1   Invisible
 2   Collapsed

这只是确保参照完整性的表格。它基本上是存储在数据库中的枚举,用于确保出现在其他表中的任何Visiblity值始终有效。

在我的前端,我有一些选择。

  1. 我可以查询此表并将其存储在Dictionary<string, int>Dictionary<int, string>中。
  2. 我可以手工编写枚举,只需在极少数事件中手动编辑值,即表格有变化。如,

    public enum Visiblity { Visible, Invisible, Collapsed }

  3. 别的什么????
  4. 你会建议哪些?为什么?

    感谢。

6 个答案:

答案 0 :(得分:3)

对于像这样相当琐碎的东西,我通常会使用枚举。我可以认为你觉得这不完全正确......但在我看来,它是两个邪恶中的较小者。

对此的一些额外理由:如果由于某种原因要添加第四个值,那么您的代码无论如何都需要更新才能够处理它。当你在这里时,更新枚举也很麻烦。

答案 1 :(得分:1)

如果您需要向表中添加新值,是否需要在应用程序中进行编码更改以支持该新值?如果是,请将其设为enum

答案 2 :(得分:1)

根据您的数据库,您可以将可见性字段设为枚举类型。这样,数据必须是您在创建表时指定的选项之一。

答案 3 :(得分:1)

如果必须根据该表中的值在应用程序中执行分支代码,则需要将该表表示为枚举。如果没有,让它只是另一个类是好的。

这是代码生成派上用场的地方 - 如果你使用的东西可以生成一个表作为枚举,你就不必考虑保持表和枚举同步 - 只需将你的行添加到表中,下次生成业务层时,枚举会自行更新。

答案 4 :(得分:0)

如果您有基于枚举的任何业务逻辑,那么您的主要选项是手动同步。如果这些行也是另一个表的外键(假设你有一个状态查找表),你应该使ID类型成为一个带有唯一索引而不是Identity的常规int,这样你就可以轻松地维护ID / Value配对如果您在不同的环境中拥有数据库,那就相同。

答案 5 :(得分:0)

与Scott Ivey的回答相反,我更喜欢(但很少使用)我只维护枚举的方法,并且在应用启动时(或者可能在构建事件中),使用Reflection来确保表值与我的枚举值匹配。这不需要任何代码生成,但很容易发现参考约束违规的延迟检测。