Список перечислений в entity framework

Entity Framework может хранить  перечисления в бд как int. А список перечислений ef уже не умеет хранить, но позволяет создавать сложные типы. Создадим сложный тип, который бы хранил список перечислений в поле int.

  1. Создадим абстрактный класс
    public abstract class Enums<T> : ICollection<T>
    {
        public Enums()
        {
            List = new List<T>();
        }
        protected List<T> List { get; set; }
        public int AsInt
        {
            get
            {
                int v = 0;
                foreach (T e in List)
                    v += 1 << Convert.ToInt32(e as Enum);
                return v;
            }
            set
            {
                List.Clear();
                if (value == 0)
                    return;
                for (int i = 0; i < 32; i++)
                {
                    if ((value & (1 << i)) != 0)
                        List.Add((T)Enum.ToObject(typeof(T), i));
                }
            }
        }
        #region ICollection<T> Members
    
        public void Add(T item)
        {
            List.Add(item);
        }
    
        public void Clear()
        {
            List.Clear();
        }
    
        public bool Contains(T item)
        {
            return List.Contains(item);
        }
    
        public void CopyTo(T[] array, int arrayIndex)
        {
            List.CopyTo(array, arrayIndex);
        }
    
        public int Count
        {
            get { return List.Count; }
        }
    
        public bool IsReadOnly
        {
            get { return false; }
        }
    
        public bool Remove(T item)
        {
            return List.Remove(item);
        }
    
        #endregion
    
        #region IEnumerable<T> Members
    
        public IEnumerator<T> GetEnumerator()
        {
            return List.GetEnumerator();
        }
    
        #endregion
    
        #region IEnumerable Members
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return List.GetEnumerator();
        }
    
        #endregion
    }
    
    
  2. Создадим класс(наш сложный тип), наследуемый от Enums
    [ComplexType]
    public class OperatingSystems : Enums<OperatingSystemEnum>
    {
    }
    

    где OperatingSystemEnum — это обычное перечисление

    public enum OperatingSystemEnum
    {
        Windows_8_32_bit, Windows_8_64_bit, Windows_7_32_bit, Windows_7_64_bit, Other
    }
    
  3. В свою модель ef добавляем свойство
    public OperatingSystems OperatingSystems { get; set; }
    

Вот и все. Но стоит заметить что в бд поле будет называться OperatingSystems_AsInt.

Ссылки:

По теме:
Настраиваем контекст бд и migration (entity framework)

Создадим контекст базы данных. Настроим логирование всех sql запросов в debug вывод. Настроим migration для обновления бд. Создадим класс — Read more

Логирование entity framework запросов

В прошлых заметках я описывал как поднять elmah и nlog логирования. Сейчас опишу как прикрутить это к entity framework. Реализуем Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Устанавливаем и настраиваем Ninject

Ninject это IoC контейнер для .NET платформы. Установим его и настроим. Установим ninject с помощью менеджера nuget Создадим класс который создает Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *