Побитовые операции над перечислениями на основе атрибутов - PullRequest
2 голосов
/ 13 марта 2020

У меня довольно большое перечисление с пользовательскими числами, такими как

 public enum DataSources
    {
        Undefined = 0,
        [Description(nameof(Resources.Web))]
        Web = 1,
        [Description(nameof(Resources.Mail))]
        Email = 2, 
        [Parent(Value = (int)Other)]
        [Description(nameof(Resources.VoIP))]
        Voip = 5,
        [Parent(Value = (int)Other)]
        [Description(nameof(Resources.ProcessAndApplications))]
        Processes = 257,
        ...

И теперь я ищу способ сохранить несколько значений DataSources (перечисление выше) в другом классе, назовем его Role (это db Entity представляет строку в базе данных).

class Role : DbEntity
{
        [PrimaryKey, Identity]
        public override long Id { get; set; }
        [Column(Name = "name"), NotNull]
        public string Name { get; set; }
        public DataSources dataSources {get;set;}
} 

Обычно я могу использовать [Flags], но я не могу изменить уже присвоенные значения для DataSources enum. Есть ли решение в этом случае? Может быть, я мог бы использовать дополнительные атрибуты для битовых значений?

1 Ответ

0 голосов
/ 13 марта 2020

Вы можете хранить несколько значений в одном столбце, используя побитовое ИЛИ. Но для этого необходимо, чтобы все значения перечисления занимали уникальные биты. Я уже вижу, что это не будет возможно в вашем случае, потому что у вас есть более одного нечетного числа.

Следующий вариант - извлечь столбец DataSources в его собственную таблицу и добавить к нему FK из роли , Ваш класс роли изменяется, как показано ниже.

class Role : DbEntity
{
    [PrimaryKey, Identity]
    public override long Id { get; set; }
    [Column(Name = "name"), NotNull]
    public string Name { get; set; }
    public IList<RoleDataSources> DataSources {get;set;}
}

class RoleDataSources : DbEntity
{
    [PrimaryKey, Identity]
    public override long Id { get; set; }
    [ForeignKey("Role"), Identity]
    public long RoleId { get; set; }
    public Role Role { get; set; }
    public DataSources Value { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...