2012-04-16 10 views
17

Hemos estado usando EF CF por un tiempo en nuestra solución. ¡Grandes fans! Hasta este punto, hemos estado usando un truco para admitir enumeraciones (creando un campo adicional en el modelo, ignorando el mapeo enum durring y asignando el campo extra a la columna en el DB que hubiéramos utilizado). Tradicionalmente hemos estado almacenando nuestras enumeraciones como cadenas (varchar) en el DB (lo hace agradable y legible). Ahora, con el soporte enum en EF 5 (Beta 2), parece que solo admite el mapeo de enumeraciones a columnas int en el DB .... ¿Podemos obtener EF 5 para almacenar nuestras enumeraciones como su representación de cadena?¿Puedo almacenar enumeraciones como cadenas en EF 5?

Donde "Type" es una enumeración de tipo DocumentType

public enum DocumentType 
    { 
     POInvoice, 
     NonPOInvoice, 
     Any 
    } 

Traté de hacer un mapa usando:

public class WorkflowMap : EntityTypeConfiguration<Model.Workflow.Workflow> 
    { 
     public WorkflowMap() 
     { 
      ToTable("Workflow", "Workflow"); 
      ... 
      Property(wf => wf.Type).HasColumnType("varchar"); 

     } 
    } 

que pensé que iba a ser la bala mágica, pero ..

Eso acaba de lanzar:

Sch ema especificado no es válido. Errores: (571,12): error 2019: miembro La asignación especificada no es válida. El tipo 'Dodson.Data.DataAccess.EFRepositories.DocumentType [anulable = False, DefaultValue =]' de 'Tipo' miembro en el tipo 'Dodson.Data.DataAccess.EFRepositories.Workflow' no es compatible con 'SqlServer .varchar [Nullable = False, DefaultValue =, MaxLength = 8000, Unicode = False, FixedLength = False] ' del miembro' Type 'en el tipo' CodeFirstDatabaseSchema.Workflow '.

¿Cuál es su opinión?

Respuesta

16

Actualmente no es posible. Enum en EF tiene las mismas limitaciones que las enumeraciones en CLR; simplemente se las denomina conjunto de valores enteros. Compruebe this article para la confirmación:

Las definiciones del tipo enum de EF viven en la capa conceptual. De manera similar a enum CLR los enums EF tienen un tipo subyacente que es uno de Edm.SByte, Edm.Byte, Edm.Int16, Edm.Int32 o Edm.Int64 con Edm.Int32 siendo el tipo subyacente predeterminado si no se ha especificado ninguno .

He publicado article y related suggestion sobre este problema. Si desea ver esta función en el futuro, vote la sugerencia.

11

Respondo a este problema hace unas semanas. Lo mejor que pude llegar es un poco hacky.

Tengo una enumeración de género en la clase Persona, y uso anotaciones de datos para asignar la cadena a la base de datos e ignorar la enumeración.

public class Person 
{ 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [Column("Gender")] 
    public string GenderString 
    { 
     get { return Gender.ToString(); } 
     private set { Gender = value.ParseEnum<Gender>(); } 
    } 

    [NotMapped] 
    public Gender Gender { get; set; } 
} 

Y el método de extensión para obtener la enumeración correcta de la cadena.

public static class StringExtensions 
{ 
    public static T ParseEnum<T>(this string value) 
    { 
     return (T)Enum.Parse(typeof(T), value, true); 
    } 
} 

Ver este post para más detalles - http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/

+0

Este es de hecho funciona, pero un poco hacky. –

+0

Lo es. Quizás EF 7 tendrá algo. – Bryan

+0

Buena solución.Un pequeño comentario, una vez que utiliza un método de extensión, puede escribir simple - value.ParseEnum (), en lugar de EnumExtensions.ParseEnum (valor). – IFink

Cuestiones relacionadas