将C#枚举作为数据库中的视图公开

时间:2019-04-18 12:27:01

标签: c# sql sql-server tsql enums

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

有一种通常的方法可以将其提供给数据库,以将其存储在数据库表中并从那里进行引用。

但是有时您不想将枚举存储在数据库中,而只想在代码中进行维护,对于这些情况,我想出了项目中的解决方案以使其视图能够返回的值。枚举,这样我们就不必在数据库中对其进行硬编码,因此在数据库中具有类似的内容

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

对于枚举

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

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

2 个答案:

答案 0 :(得分:3)

这一切都取决于。

像我这样的老派数据库专家希望您在数据模型中建立有效性检查。有关如何操作,请参见this question。最后,您会得到一个不错的,具有自文档说明的架构,该架构可确保您的应用程序只能包含ValidationFailReasonTypes的有效条目。

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

我认为选择一种方法并坚持下去很重要。您的解决方案-如果我正确理解-两者都有。

通常,我会使用一个枚举来表示在没有新版本应用程序的情况下不会更改的值,通常是因为您启用了一些新功能。

我希望将数据库条目用于某些可以在业务领域中更改的项目,而与您的应用程序的发行版无关。 “网格级别”和“表单级别”感觉就像您的应用程序中的功能,因此我认为枚举是可以的。

答案 1 :(得分:0)

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

创建一个表并将引用完整性添加到该字段,即使该表对于所有永恒而言只有两行。