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

在数据库中将C#枚举作为视图公开,c#,sql,sql-server,tsql,enums,C#,Sql,Sql Server,Tsql,Enums,假设数据库中有一列可以接受C#代码中定义的枚举的任何一个值 有一种通常的方法可以使它对数据库可用,即将它存储在数据库表中并从那里引用它 但有时您不想将枚举存储在数据库中,而只想在代码中维护它,对于这些情况,我在项目中提出了一个解决方案,它将返回枚举值,这样我们就不必在数据库中硬编码它,所以在数据库中有类似的内容 CREATE VIEW ENUM.ValidationFailReasonTypes AS SELECT 1 AS [FormLevel], 2 AS [GridLevel] 用于枚举

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

有一种通常的方法可以使它对数据库可用,即将它存储在数据库表中并从那里引用它

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

CREATE VIEW ENUM.ValidationFailReasonTypes
AS
SELECT 1 AS [FormLevel], 2 AS [GridLevel]
用于枚举

public enum ValidationFailReasonTypes
{
    FormLevel = 1,
    GridLevel = 2
}
所以我只是想问,这样做是一个好主意,还是当我们不想在数据库中存储enum时,有更好的方法来处理这种情况?

这完全取决于情况

像我这样的老派数据库人员希望您在数据模型中建立有效性检查。看看你会怎么做。您最终得到了一个良好的自文档模式,它保证您的应用程序只能包含ValidationFailReasonType的有效条目

另一种观点是,数据库只是一种存储机制,应用程序作为数据有效性的保证是完全可以的,特别是如果它有很多单元测试的话。在本例中,您在C#中使用一个枚举,编写单元测试以验证条目是否符合您的期望,并接受这样一个事实:您的数据库表有一个整型列,其中可能包含许多值,但应用程序将其限制为(1,2)

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

一般来说,我会使用枚举来表示没有应用程序新版本就不会更改的值,通常是因为您正在启用一些新功能


我希望使用一个数据库条目来处理一些可以在业务领域中独立于应用程序版本进行更改的内容。“网格级别”和“表单级别”感觉像是应用程序中的功能,所以我认为枚举是可以的。

枚举的全部原因是编码时的一致性、清晰性和易用性。我想你也会希望数据库方面的清晰性和一致性。如果将枚举值持久化到数据库,则列和相应的定义表上绝对应该具有引用完整性。依我看,这景色对你毫无帮助


创建一个表,并将引用完整性添加到字段中,即使它永远只有两行。

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