Как хранить двоичные наборы разрешений


Я пытаюсь найти способ хранения информации о разрешениях в базе данных SQL Server 2012. Мои разрешения устанавливаются следующим образом:

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

И я не могу найти способ хранения в базе данных, скажем, 00000011, который позволяет иметь доступ к чтению / записи некоторых вещей в моей программе. У меня есть столбец int, готовый хранить это, но пока не могу понять, как его использовать.

2 2

2 ответа:

Вы должны сделать что-то вроде этого:

[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;

Entity Framework (я думаю EF > 4.5, если я хорошо помню) может одновременно управлять типами Enum, поэтому вам не нужно приводить к целому и от целого в базе данных, я настоятельно рекомендую использовать EF, если ваша внутренняя база данных поддерживается.

Вам нужно использовать побитовое или | в вашем перечислении.

PermissionsB permission = PermissionsB.read | PermissionsB.write;

Смотрите здесь для получения дополнительной информации о перечислениях в C#

Смотрите здесь для получения очень подробной информации об использовании побитовых перечислений