如何存储权限二进制集

时间:2014-12-29 16:17:53

标签: c# database enums sql-server-2012 user-permissions

我正在尝试找到一种将权限信息存储到SQL Server 2012数据库的方法。 我的权限是这样的设置:

[Flags]
public enum PermissionsB
{
    Aucun = 00000000,
    read = 00000001,
    write= 00000010,
    ssss = 00000100,
    tttt = 00001000,
    rrrr = 00010000,
}

我无法找到存储到数据库中的方法,让我们说,00000011允许用户在我的程序中读取/写入一些内容。我确实有一个int列准备存储,但无法弄清楚如何使用它。

2 个答案:

答案 0 :(得分:5)

你应该这样做:

[Flags]
public enum PermissionsB
{
    Aucun = 0,
    read = 1,
    write= 2,
    ssss = 4,
    tttt = 8,
    rrrr = 16,
}

或使用C#7数字文字语法,这可能会提高可读性:

[Flags]
public enum PermissionsB
{
    Aucun= 0b00000,
    read = 0b00001,
    write= 0b00010,
    ssss = 0b00100,
    tttt = 0b01000,
    rrrr = 0b10000,
}

然后正如杰弗里所说,你应该使用按位操作:

PermissionsB permission = PermissionsB.read | PermissionsB.write;

您要存储的值是一个整数,您可以直接投射它:

int intPermission = (int) permission;

要恢复已保存的权限,您可以这样做:

PermissionsB retrievedPermission = (PermissionsB) retrievedInteger;

要测试单个权限,只需使用按位操作:

bool canWrite = (retrievedPermission & PermissionsB.write) == PermissionsB.write;

实体框架(我认为EF> 4.5,如果我记得很清楚的话)可以很好地管理Enum类型,所以你不需要在数据库中强制转换Integer,我强烈建议你使用EF作为你的后端支持数据库。

答案 1 :(得分:0)

您需要在枚举上使用按位或|

PermissionsB permission = PermissionsB.read | PermissionsB.write;

请参阅Here for more information on enums in C#

请参阅Here for very detailed information on using bitwise enums