Как хранить двоичные наборы разрешений
Я пытаюсь найти способ хранения информации о разрешениях в базе данных SQL Server 2012. Мои разрешения устанавливаются следующим образом:
[Flags]
public enum PermissionsB
{
Aucun = 00000000,
read = 00000001,
write= 00000010,
ssss = 00000100,
tttt = 00001000,
rrrr = 00010000,
}
И я не могу найти способ хранения в базе данных, скажем, 00000011, который позволяет иметь доступ к чтению / записи некоторых вещей в моей программе. У меня есть столбец int, готовый хранить это, но пока не могу понять, как его использовать.
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#
Смотрите здесь для получения очень подробной информации об использовании побитовых перечислений