Как работать с Enums в Entity Framework?

Каков наилучший способ работы с Enums в Entity Framework?

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

Ответ 2

Update:
Entity Framework теперь поддерживает Enums nativity.

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

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

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

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

Ответ 3

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

Видео: Entity Framework 5 Перечисления и перемещение решения из EF 4.3 от Julie Lerman

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

Там также этот вводный пост в блоге Entity Framework Design:

Поддержка перечислений в инфраструктуре Entity

Ответ 4

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

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/Property на некотором объекте, например.

Users.CommunicationPreferenceID

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

CommunicationPreferencesList usersPreference = (CommunicationPreferencesList)currentUser.CommunicationPreferenceID;

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

Затем у меня есть некоторые простые помощники, например. предоставить EnumTextValue из экземпляра перечисления, например.

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

 => "Mobile Telephone"

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

Ответ 5

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

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