Как работать с Enums в Entity Framework? - PullRequest
53 голосов
/ 06 октября 2009

Как лучше всего работать с Enums в Entity Framework?

Замечания: я использую EF 3 и Firebird.

Ответы [ 5 ]

27 голосов
/ 09 октября 2009

Есть несколько лучший способ сделать это в EF 4 . К сожалению, это не сработает в EF 1.

Вот другой подход .

Обновление: Реальная поддержка перечисления была добавлена ​​в EF CTP июня 2011 .

19 голосов
/ 06 октября 2009

Обновление:
Entity Framework теперь поддерживает перечисления Enums.

Оригинал:
Это одна из тех раздражающих вещей в EF. Пока не буду его поддерживать!

Или вы можете сделать что-то вроде:

public MyEnum MyEnumProperty  
{  
  get { return (MyEnum) InnerEnumProperty; }  
  set { InnerEnumProperty = (int) value; }  
}

Но это заставляет меня чувствовать себя грязным.

11 голосов
/ 14 июня 2012

Этот вопрос устарел, но позвольте мне указать вам на более свежий материал, поскольку сегодня у нас есть более новая версия Entity Framework:

Видео: перечисления Entity Framework 5 и решение Moving от EF 4.3 от Джули Лерман

Я использовал это видео сегодня, чтобы догнать enums в Entity Framework. Это отличная пошаговая демонстрация. Надеюсь, вам это тоже поможет.

В блоге Entity Framework Design также есть вступительный пост:

Поддержка перечисления в Entity Framework

6 голосов
/ 07 июля 2011

Я интенсивно использую таблицы (со значениями по умолчанию) в БД вида

CREATE TABLE [dbo].[CommunicationPreferences]
(
    [ID] smallint NOT NULL,
    [SystemName] nvarchar(50) NOT NULL,
    [Description] nvarchar(200) NOT NULL,
)

И я вожу свои сущности EF4 из БД.

N.B. Я не использую никакие представления, функции SPROCS или SQL, никакие сложные типы EF, только прямое отображение таблицы на сущность. Затем расширьте мои частичные классы сущностей, чтобы добавить дополнительную функциональность, чтобы сохранить вещи СУХОЙ.

Для Enums у меня есть простой шаблон T4, который я передаю список таблиц (в форме выше), файл .tt запускается всякий раз, когда я обновляю модель EF из БД (или, если мне нужно по требованию) ), он захватывает данные и создает Enums, например

/// <summary> 
/// Enums For The dbo Schema
/// </summary>
public enum CommunicationPreferencesList : short
{
    /// <summary> 
    /// HTML Emails
    /// </summary>
    [EnumTextValue(@"HTML Emails")]
    HTMLEmail = 1,

    /// <summary> 
    /// Plain Text Emails
    /// </summary>
    [EnumTextValue(@"Plain Text Emails")]
    PlainEmail = 2,

    /// <summary> 
    /// Mobile Telephone
    /// </summary>
    [EnumTextValue(@"Mobile Telephone")]
    Mobile = 3,

    /// <summary> 
    /// Landline Telephone
    /// </summary>
    [EnumTextValue(@"Landline Telephone")]
    Landline = 4,

    /// <summary> 
    /// SMS
    /// </summary>
    [EnumTextValue(@"SMS")]
    SMS = 5,

}

Тогда, когда я имею дело со столбцом FK ID / Свойством для некоторой сущности, например,

Users.CommunicationPreferenceID

Я просто приведу ID или перечисление для сравнения. например,

CommunicationPreferencesList usersPreference = (CommunicationPreferencesList)currentUser.CommunicationPreferenceID;

if(usersPreference == CommunicationPreferencesList.SMS)
{
//send SMS
}
else if(usersPreference == CommunicationPreferencesList.Mobile)
{
//ring the phone
}

У меня есть несколько простых помощников, например, дать EnumTextValue из экземпляра enum, например

string chosenMethod = EntityHelper.GetEnumTextValue(CommunicationPreferencesList.Mobile);

 => "Mobile Telephone"

Я нахожу это простым, беспроблемным, прозрачным, простым в использовании, и для моих целей это доставляет удовольствие, и я счастлив. Я не вижу необходимости полностью маскировать числовое значение в БД / сущности из потребляющего кода, я очень рад преобразовать одно или другое из значений и в итоге получаю довольно чистый читаемый код, плюс приятный маленький дополнительный EnumTextValue, который генерируется из поля [Description] в БД.

0 голосов
/ 17 августа 2012

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

Единственным подводным камнем является добавление атрибута игнорирования сериализации, например, при использовании в сочетании с WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...