property framework first enum c# enums foreign-keys entity-framework-6

c# - first - ¿Puede una columna de clave externa ser un Enum en el código de Entity Framework 6 primero?



enum entity framework database first (2)

Estoy convirtiendo EF5 DB primero en código EF6 primero. en la configuración anterior, hay algunos FK que son bytes. y en la aplicación se asignan a enumeraciones con el tipo de byte subyacente. esto ha estado funcionando maravillosamente.

Pasando al código primero y EF6, encontré afirmaciones de que las enumeraciones deberían "funcionar" y, de hecho, ese parece ser el caso de las columnas regulares. Puedo ir de esto

public byte FavPersonality {get;set;}

a esto:

public Personality FavPersonality {get;set;}

pero cuando se trata de columnas que también son claves foráneas obtengo este error:

System.ArgumentException : The ResultType of the specified expression is not compatible with the required type. The expression ResultType is ''Edm.Byte'' but the required type is ''Model.Personality''.

¿Esto es algo que no se puede hacer con EF6 + Code primero?

editar:

enum se define como: byte


También recibí el error:

El ResultType es MyEnum de la expresión especificada no es compatible con el tipo requerido ''Edm.Int32''. Nombre del parámetro: keyValues ​​[0]

Al usar la asignación de enumeración:

[Column("MyActualFKColumnId", TypeName = "int")] public MyEnum MyEnum { get; set; } // NB : Foreign Key refers to the C# Property, not the DB Field [ForeignKey("MyEnum")] public MyEntityReferencedByEnum MyEntityReferencedByEnum { get; set; }

Sin embargo, pude MyActualFKColumnId el problema restableciendo la clave externa entera original ( MyActualFKColumnId ), eliminando los atributos [Column] y [ForeignKey] , y luego agregando un hack de propiedad [NotMapped] a la clase:

[NotMapped] public MyEnum MyEnum { get { return (MyEnum) MyActualFKColumnId; } set { MyActualFKColumnId=(int)value; } }


Acabo de toparme con este mismo problema, ya que mi enumeración es una enumeración de números básicos, pero esto surgió como el primer resultado en la búsqueda por mensaje. Tenía un subtipo en mi objeto principal donde los valores eran de un conjunto fijo de valores. Pero, también había objetos para aquellos para que pudiéramos escribir consultas contra ellos.

public class Foo { [Key] public int Id { get; set; } public BarEnum BarId { get; set; } [ForeignKey(nameof(BarId))] public Bar Bar { get; set; } } public class Bar { [Key] public int Id { get; set; } } public enum BarEnum { Type1, Type2 }

Esta configuración me dio el mismo mensaje de error como se describe en esta pregunta:

El ResultType de la expresión especificada no es compatible con el tipo requerido. La expresión ResultType es ''BarEnum'' pero el tipo requerido es ''Edm.Int''.

La resolución para esto fue simple: simplemente cambie el ID de la Bar para usar la enumeración, y todo funcionó sin problemas. Esto tiene sentido, ya que hay muchos más valores posibles para un int que para un BarEnum .

public class Bar { [Key] public BarEnum Id { get; set; } }