visual studio mvc instalar framework first español code entity-framework entity-framework-5

entity-framework - mvc - instalar entity framework visual studio 2017



¿Puedo almacenar enumeraciones como cadenas en EF 5? (2)

Esto no es posible actualmente. Enum en EF tiene las mismas limitaciones que enums en CLR: solo se denominan conjunto de valores enteros. Revisa este artículo para confirmar:

Las definiciones de tipo de enumeración EF se encuentran en la capa conceptual. De manera similar a las enumeraciones de CLR, las enumeraciones de EF tienen un tipo subyacente que es Edm.SByte, Edm.Byte, Edm.Int16, Edm.Int32 o Edm.Int64, siendo Edm.Int32 el tipo subyacente predeterminado si no se ha especificado ninguno.

Publiqué un article y una sugerencia relacionada con este problema. Si desea ver esta función en el futuro, vote por la sugerencia.

Hemos estado usando EF CF por un tiempo en nuestra solución. ¡Grandes fans! Hasta este momento, hemos estado usando un truco para dar soporte a las enumeraciones (creando un campo adicional en el modelo; ignore la enumeración durante la asignación y asigne el campo adicional a la columna en la base de datos que habríamos utilizado). Tradicionalmente, hemos estado almacenando nuestras enumeraciones como cadenas (varchars) en el DB (lo hace agradable y legible). Ahora, con el respaldo de enumeración en EF 5 (Beta 2), parece que solo es compatible con la asignación de enums a las columnas int en la base de datos ... ¿Podemos hacer que EF 5 almacene nuestras enumeraciones como su representación de cadena?

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

public enum DocumentType { POInvoice, NonPOInvoice, Any }

Intenté mapearlo usando:

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

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

Eso acaba de tirar:

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

¿Tus pensamientos?


Me topé con este problema hace unas semanas. Lo mejor que se me ocurre 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); } }

Consulte esta publicación para obtener todos los detalles: http://nodogmablog.bryanhogan.net/2014/11/saving-enums-as-strings-with-entity-framework/