2009-10-06 18 views

Respuesta

19

Actualización:
Marco de la entidad ahora es compatible con enumeraciones nacimiento.

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

O puede hacer algo como:

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

pero me hace sentir sucia.

+2

Ya conocía esta solución y realmente se ve sucio Pero ... –

+2

es un poco sucio, pero hay otro problema, si utiliza este campo dentro de una consulta, EF se quejará. Para ese problema creé este contenedor: http://landman-code.blogspot.com/2010/08/adding-support-for-enum-properties-on.html que desde el exterior de su entidad le permite mantenerse limpio de Detalles de EF ... –

6

que hacen un uso intensivo de las tablas (con valores por defecto) en la base de datos de la forma

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

Y puedo conducir mi EF4 entidades de la BD.

N.B. No uso vistas, SPROCS o funciones de SQL, no hay tipos de EF complejos, solo directo de la tabla al mapeo de entidades. Luego amplíe mis clases parciales de entidades para agregar funcionalidad adicional para mantener las cosas SECAS.

Para las Enumeraciones 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 de la base de datos (o si necesito hacerlo) demanda), capta los datos y crea Enumeraciones, por ejemplo

/// <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, 

} 

Luego, cuando estoy tratando con una columna FK ID/Propiedad en alguna entidad, por ejemplo,

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 a, p. dar el valor de EnumTextValue de una instancia enum, p.

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

=> "Mobile Telephone" 

Me parece simple, libre, transparente, fácil de usar, y para mis propósitos funciona un convite y estoy feliz de molestia. 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.

+2

Interesante idea. Sin embargo, hay posibles problemas de integridad de datos. Si elimina/edita una entrada de db existente y regenera la plantilla de T4, el código que utiliza la enumeración eliminada no se compilará. Y (peor) si alguien borró accidentalmente una entrada de db y la volvió a instalar, la clave podría ser diferente. Entonces, cualquier valor de enum guardado en la base de datos se asociaría con el elemento incorrecto en la enumeración (o no habría ningún valor coincidente). Tal vez hacerlo al revés - persistir el enum a DB podría ser menos propenso a errores? – Appetere

+0

Bueno, pero personalmente nunca he tenido ningún problema ... 1. No uso identidad en la columna PK, por lo que no coinciden con las ID de incremento automático. Simplemente no es posible 2. No hace la diferencia en qué dirección va la persistencia lo que importa es que alguien no cambia uno sin el otro, o que hay un mecanismo para asegurar que se mantengan sincronizados, es decir, yo uso un guión sql de valores predeterminado automático para establecer los datos de la tabla de búsqueda (si de alguna manera ha cambiado) en cada aplicación/DB publicar 4. QUEREMOS que el código que utiliza la entrada eliminada no se compile. Ese es todo el punto ! – MemeDeveloper

11

Esta pregunta es un poco viejo, pero te voy a apuntar a un material más reciente ya que hoy tenemos una nueva versión de Entity Framework:

Video: Entity Framework 5 Enums and Moving Solution from EF 4.3 por Julie Lerman

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

Hay también este post introductorio sobre Entidad Diseño Marco de blog:

Enumeration Support in Entity Framework

0

que tenía un problema similar y lo resolvió 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 de ignorar, por ejemplo cuando se usa en combinación con WCF.