Каков наилучший способ работы с Enums в Entity Framework?
Примечания: Я использую EF 3 и Firebird.
Каков наилучший способ работы с Enums в Entity Framework?
Примечания: Я использую EF 3 и Firebird.
Существует несколько лучший способ сделать это в EF 4. К сожалению, он не будет работать в EF 1.
Здесь другой подход.
Обновление: Реальная поддержка перечисления была добавлена в июнь 2011 EF CTP.
Update:
Entity Framework теперь поддерживает Enums nativity.
Оригинал:
Это одна из тех раздражающих вещей, связанных с EF. Пока не поддержу!
Или вы можете сделать что-то вроде:
public MyEnum MyEnumProperty
{
get { return (MyEnum) InnerEnumProperty; }
set { InnerEnumProperty = (int) value; }
}
Но это заставляет меня чувствовать себя грязным.
Этот вопрос немного стар, но позвольте мне указать на более свежий материал, так как сегодня у нас есть более новая версия Entity Framework:
Видео: Entity Framework 5 Перечисления и перемещение решения из EF 4.3 от Julie Lerman
Я использовал это видео сегодня, чтобы догнать enums
в Entity Framework. Это отличная пошаговая демонстрация. Надеюсь, он вам тоже поможет.
Там также этот вводный пост в блоге Entity Framework Design:
Я активно использую таблицы (со значениями по умолчанию) в БД формы
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] в БД.
У меня была аналогичная проблема и она была решена путем написания расширения на сущности через механизм частичного класса. Я просто добавил свойство, которое выполняет литье поля БД уже в сущности, в нашем случае просто целое число.
Только ошибка заключается в добавлении атрибута сериализации игнорирования, например, при использовании в сочетании с WCF.