¿Cómo trabajar con Enums en Entity Framework?

¿Cuál es la mejor manera de trabajar con Enums en Entity Framework?

Observaciones: Estoy usando EF 3 y Firebird.

Hay una forma algo mejor de hacerlo en EF 4 . Desafortunadamente, no funcionará en EF 1.

Aquí hay otro enfoque .

Actualización: se agregó soporte de enum real en el EF CTP de junio de 2011 .

Actualizar:
Entity Framework ahora admite la natividad de Enums.

Original:
Esta es una de esas cosas irritantes sobre EF. ¡No lo estará apoyando todavía!

O puedes hacer algo como:

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

Pero me hace sentir sucio.

Esta pregunta es un poco antigua, pero permítanme señalarles un material más reciente, ya que hoy tenemos una versión más nueva de Entity Framework:

Video: Entity Framework 5 Enums y Moving Solution de EF 4.3 por Julie Lerman

Utilicé este video hoy para enums al día con enums en Entity Framework. Es una gran demostración paso a paso. Espero que te ayude también.

También hay esta publicación introductoria en el blog de Entity Framework Design:

Soporte de enumeración en Entity Framework

Hago un uso intensivo de tablas (con valores predeterminados) en DB de la forma

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

Y conduzco mis entidades EF4 desde el DB.

NB No uso vistas, SPROCS o funciones de SQL, no hay tipos complejos de EF, solo direccionamiento de tabla a entidad. Luego amplíe mis clases parciales de entidades para agregar funcionalidad adicional para mantener las cosas SECAS.

Para Enums tengo una plantilla T4 simple, a la que entrego una lista de tablas (del formulario anterior), el archivo .tt se activa cada vez que actualizo el modelo EF desde el DB (o si lo necesito a pedido), toma los datos y construye Enums, por ejemplo

 ///  /// Enums For The dbo Schema ///  public enum CommunicationPreferencesList : short { ///  /// HTML Emails ///  [EnumTextValue(@"HTML Emails")] HTMLEmail = 1, ///  /// Plain Text Emails ///  [EnumTextValue(@"Plain Text Emails")] PlainEmail = 2, ///  /// Mobile Telephone ///  [EnumTextValue(@"Mobile Telephone")] Mobile = 3, ///  /// Landline Telephone ///  [EnumTextValue(@"Landline Telephone")] Landline = 4, ///  /// SMS ///  [EnumTextValue(@"SMS")] SMS = 5, } 

Entonces, cuando estoy tratando con una columna / propiedad FK ID en alguna entidad, por ej.

 Users.CommunicationPreferenceID 

Simplemente eché el ID o la enumeración para la comparación. p.ej

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

Luego tengo algunos ayudantes simples para, por ejemplo, dar el EnumTextValue de una instancia enum, por ejemplo

 string chosenMethod = EntityHelper.GetEnumTextValue(CommunicationPreferencesList.Mobile); => "Mobile Telephone" 

Encuentro esto simple, sin problemas, transparente, fácil de usar, y para mis propósitos funciona de maravilla y estoy feliz. No veo la necesidad de enmascarar totalmente el valor numérico en la base de datos / entidad del código de consumo, estoy muy contento de emitir uno u otro de los valores, y terminar con un código legible bastante limpio, más el pequeño y extra extra de EnumTextValue que se genera desde el campo [Descripción] en el DB.

Tuve un problema similar y lo resolví escribiendo una extensión en la entidad a través del mecanismo de clase parcial. Acabo de agregar una propiedad que hace el casting del campo DB ya en la entidad, en nuestro caso solo un entero.

El único inconveniente es agregar un atributo de serialización ignorada, por ejemplo cuando se usa en combinación con WCF.