【问题标题】:Exposing C# enums as views in database将 C# 枚举公开为数据库中的视图
【发布时间】:2019-04-18 21:36:37
【问题描述】:

假设我在数据库中有一个列可以接受在我的 C# 代码中定义的枚举的任何一个值。

有一种常用的方法可以让数据库可以将其存储在数据库表中并从那里引用它。

但有时您不想将枚举存储在数据库中,而只想在代码中维护它,对于这些情况,我在我的项目中提出了解决方案,以便拥有一个返回值的视图枚举,这样我们就不必在数据库中硬编码它,所以在数据库中有这样的东西

CREATE VIEW ENUM.ValidationFailReasonTypes
AS
SELECT 1 AS [FormLevel], 2 AS [GridLevel]

对于枚举

public enum ValidationFailReasonTypes
{
    FormLevel = 1,
    GridLevel = 2
}

所以只是想问一下,当我们不想将枚举存储在数据库中时,这样做是个好主意还是有更好的方法来处理这种情况?

【问题讨论】:

  • 您要存储在枚举中的数据类型与您要存储在数据库中的数据类型不同。枚举应该用于极不可能更改的内容,而存储在数据库中的数据应该用于应该易于更改的内容。
  • 在数据库中声明这些内容的主要好处之一是声明性引用完整性,确保错误的数据不会最终出现在数据库中。但是你不能在引用的“表”实际上是一个视图的地方声明一个外键。

标签: c# sql sql-server tsql enums


【解决方案1】:

这一切都取决于。

像我这样的老派数据库人员希望您在数据模型中构建有效性检查。请参阅this question 了解您将如何做到这一点。您最终会得到一个很好的自文档架构,它保证您的应用程序只能包含 ValidationFailReasonTypes 的有效条目。

另一种观点是,数据库只是一种存储机制,应用程序作为数据有效性的保证者是完全可以的,尤其是在它有大量单元测试的情况下。在这种情况下,您在 C# 中使用 ENUM,编写单元测试以验证条目是否符合您的期望,并接受您的数据库表有一个整数列可能包含大量值的事实,但应用程序将其限制为 (1 , 2).

我认为选择一种方法并坚持下去很重要。你的解决方案——如果我理解正确的话——两者兼而有之。

一般来说,如果没有新版本的应用程序,我会使用枚举来表示不会改变的值,通常是因为您启用了一些新功能。

我希望将数据库条目用于可以在业务领域中独立于应用程序发布而发生变化的内容。 “网格级别”和“表单级别”感觉就像您的应用程序中的功能,所以我认为枚举是可以的。

【讨论】:

    【解决方案2】:

    枚举的全部原因是编码时的一致性、清晰性和易用性。我认为您也希望在数据库方面具有这种清晰度和一致性。如果将枚举值持久保存到数据库中,则绝对应该对列和相应的定义表具有引用完整性。在我看来,这种观点不会为您节省任何东西。

    创建一个表并为该字段添加参照完整性,即使它只有两行永久。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-09
      • 2018-12-24
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多