Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据库中存储多个枚举的最佳方法_C#_Sql_Enums - Fatal编程技术网

C# 在数据库中存储多个枚举的最佳方法

C# 在数据库中存储多个枚举的最佳方法,c#,sql,enums,C#,Sql,Enums,我有一个名为RoleEnum的枚举,有四个值User(1)、Supervisor(2)、Admin(3)和ITOperator(4)。我有一个公告表,它显然存储了公告数据(标题、文本、开始和结束日期)。但是,我希望能够添加一个名为Roles的新列,该列定义了哪些用户可以在哪些角色中查看公告 通常,在SQL中存储枚举时,我只使用smallint数据类型,但是在这种情况下,这不起作用,因为一个公告可以被多个角色看到 我考虑做的是将Roles列定义为varchar(x)并在存储它们时用逗号分隔。然而,

我有一个名为
RoleEnum
的枚举,有四个值
User
(1)、
Supervisor
(2)、
Admin
(3)和
ITOperator
(4)。我有一个公告表,它显然存储了公告数据(标题、文本、开始和结束日期)。但是,我希望能够添加一个名为Roles的新列,该列定义了哪些用户可以在哪些角色中查看公告

通常,在SQL中存储枚举时,我只使用smallint数据类型,但是在这种情况下,这不起作用,因为一个公告可以被多个角色看到

我考虑做的是将
Roles
列定义为varchar(x)并在存储它们时用逗号分隔。然而,我认为/不知道这是否是最好的路线。我不想创建一个新表来保存一对多关系


有什么想法吗?

只需像实体框架那样做,并将它们存储为INT


查看此以了解更多

如果您关心可维护性,我会尽可能坚持使用第三范式

角色
RoleID RoleName
1用户
2主管
3管理员
4电子操作员
公告
AnnouncementID标题。。。
一福。。。
2巴。。。
公告可视性
AnnouncementID RoleID
1               1
1               2
2               2
2               3
2               4

这是一种可能的解决方案-不保证是最好的,但不需要新表

您可以在枚举上添加属性-这使枚举成为一个位字段,其中各个枚举值可以一起屏蔽。然后,您的枚举将如下所示:

[Flags]
public enum RoleEnum : long
{
    User = 1,
    Supervisor = 2,
    Admin = 4,
    ITOperator = 8
}
您可以使用“|”(按位
)运算符将多个角色屏蔽在一个64位整数中,您可以将其存储在数据库的整数字段(a
bigint
)中


如果您不需要64个可能的角色,您可以使用
int
来代替,这将为您提供32个可能的不同角色。

不要使用逗号分隔的值。这将是您以后必须解析的内容。一个规范化的表结构可以很好地解决这个问题。。。。我们将枚举值设置为,1,3,5,7,9。。。。如果消息是针对单个组的,则将消息的值设置为其中一个数字;如果有两个或几个组可以查看消息,则添加组数,并将该消息的值设置为sum@pithhelmet应该在我的帖子中解释这一点,但目前用户是1,2,管理员3和操作员4。问题是,如果用户、管理员和it运营商都能看到公告,或者每个人都能看到公告,等等,该怎么办?删除我的说明性评论,因为它不再需要了。相反,我敦促您遵循JDB解决方案。为什么不使用另一个表,这就是数据库的用途!我喜欢@xxbbcc的想法,但无法对其发表评论^^^^^^^^这正是我在我的第一部分对OP的评论中的意思+主席先生,虽然我大致上很欣赏你的意见,但这根本不能回答问题。如果我想存储枚举值,这些值将不会更改,而且最糟糕的是,每个值在开发时都有特定的含义。因此,如果您为这些枚举值创建一个表,那么您最终将使用一个枚举来赋予每个静态表的行以意义。对于这个特定的问题,答案应该是@xxbbcc's one。@大卫,我认为你不理解这个问题。问题是如何将公告与SQL中的多个角色关联。您不能在SQL中使用标志注释。亲爱的JDB,请重新阅读问题。请注意,他对使用Enum非常明确。他想用一个简单的列来存储值,他知道他有多个值(他提到了逗号分隔的解决方案)。是的,他可以建立多对多的关联,但必须编写大量代码,而不需要任何理由。在这种情况下,xxbbcc的解决方案更为实用。您不需要任何特殊的SQL注释,只需存储变量的值,只需使用布尔运算符组合/分解它。你的建议大体上是正确的,但这是非常具体的。@DavidSilva Barrera-我能理解你的观点。就我个人而言,我认为理想情况下数据库应该独立运行,而不必太关心客户机源代码。我参与过几个项目,其中需要保留现有数据库,但客户机被完全重写(例如,从桌面到web)。在列中存储枚举标志对我来说似乎是短视的。。。在我看来,SQL查询变得更加复杂和难以理解,但我想这一切都归结于单个项目。我坚持我的答案,但我承认还有其他观点。这与数据库中的数据非常接近。当然,如果你有C#source,你知道它们的意思,但只有当你有C#source时,你才知道。我不认为它是幻数,你在数据库中存储枚举值的唯一int标识符,如果这是错误的,那么在另一个表中存储表的主键作为外键也是错误的。如果您没有源代码或至少没有文档,那么首先为什么要管理该数据库?引用的文章根本没有讨论数据库,而是讨论源代码中的幻数,即使有源代码也是一个问题。
RoleEnum userRoles = RoleEnum.User | RoleEnum.Admin;