2014-12-29 3 views
2

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

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

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

+4

Так этот вопрос только о сохранении значения int в вашей базе данных? Или вы не знаете, как преобразовать значение enum в int? Можете ли вы уточнить свою проблему? – StriplingWarrior

+1

на самом деле ваши двоичные флаги не являются бинарными, вы должны использовать префикс 0x для десятичного числа, чтобы сохранить его как двоичный, вы можете просто выполнить операцию ИЛИ, чтобы добавить разрешения вместе в один двоичный номер и сохранить его в своей базе данных. – CME64

+1

@ CME64 '0x' является шестнадцатеричным, а не двоичным. –

ответ

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; 

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

+1

Вы забыли '[Flags]' -Attribute – khlr

+0

Хорошо, поэтому мне нужно в основном добавить разрешение, подобное этому (для разрешений на чтение и запись): PermissionsB permission = PermissionsB.read | PermissionsB.write; Который даст мне 3, и я храню этот int в базе данных. Как получить отдельные разрешения для проверки условия, чтобы отображать разрешение для каждого пользователя? – You

+0

Спасибо @khlr, обновил мой код. –

0

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

PermissionsB permission = PermissionsB.read | PermissionsB.write; 

См Here for more information on enums in C#

См Here for very detailed information on using bitwise enums

+0

Хорошие ссылки спасибо. Как сохранить это разрешение в базе данных? – You

+0

Просто нарисуйте мой пример 'permission' на int и сохраните его. –

Смежные вопросы