¿Cuál es la mejor manera de trabajar con Enums en Entity Framework?¿Cómo trabajar con Enums en Entity Framework?
Observaciones: Estoy utilizando EF 3 y Firebird.
¿Cuál es la mejor manera de trabajar con Enums en Entity Framework?¿Cómo trabajar con Enums en Entity Framework?
Observaciones: Estoy utilizando EF 3 y Firebird.
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.
Ya conocía esta solución y realmente se ve sucio Pero ... –
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 ... –
There is a somewhat better way to do it in EF 4. Lamentablemente, no funcionará en EF 1.
Aquí está another approach.
Actualización: se añadióreal apoyo enumeración en the June 2011 EF CTP.
el otro enfoque funciona para EF1 y EF4 por cierto. –
Esta actualización es referente a EF5? –
@Michel, [sí, puede hacerlo en EF 5] (http://msdn.microsoft.com/en-us/data/hh859576.aspx). –
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.
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
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
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:
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.
[Esto también funciona] (http://daniel.wertheim.se/2010/06/09/detallando-con-enumeraciones-y-entidad-framework-4-code-first/) – Korayem