2010-01-14 6 views
8

Pregunta 1: estoy jugando con EF4 y tengo una clase modelo como:¿Cómo usar ADO.net Entity Framework 4 con Enumerations? ¿Cómo lo hago?

public class Candidate { 

public int Id {get;set;} 
public string FullName {get;set;} 
public Gender Sex {get;set;} 
public EducationLevel HighestDegreeType {get;set;} 
} 

Aquí Género y Nivel de formación son enumeraciones como:

public enum Gender {Male,Female,Undisclosed} 
public enum EducationLevel {HighSchool,Bachelors,Masters,Doctorate} 

¿Cómo puedo obtener la clase de candidato y Género Nivel de formación y trabajo con EF4 si:

  • hago desarrollo del primer modelo
  • hago d b primer desarrollo

Editar: pregunta movida relacionada con el contexto del objeto a otra pregunta here.

Respuesta

16

Aparentemente int <-> enumwon't be supported in the initial release of EF 4. Estoy de acuerdo con los que dicen que esto es una mierda.

estoy usando una propiedad que hace el casting para mí

public partial class MyEntity 
{ 
    public MyEnum HurrEnum {get{return (MyEnum)Hurr;} set{Hurr = (int)value;}} 
} 

No parece tan malo si el nombre de cosas "correctamente" (lo que significa, por lo que no se ve estúpida). Por ejemplo, tengo una enumeración ReasonCode que está almacenada como un Reason en la base de datos, así que tengo las versiones ReasonCode y ReasonCode de la propiedad. Funciona bastante bien, por ahora.


En primer lugar, estoy empezando a utilizar EF4 así que no estoy íntima con su funcionamiento. Supongo que es similar a L2S pero con mejor soporte de entidad. Tomar esto con un grano de sal.

Para ser claros, esta propiedad es para su conveniencia y estoy seguro de que el 90% de los EF reaccionarán mal si intenta consultar la base de datos con esta propiedad. EF no conoce su propiedad y no puede usarla para construir sql. Así que esto:

var foo = from x in Db.Foos where x.HurrEnum == Hurr.Durr select x; 

probablemente fallará a comportarse como se esperaba que esto:

var foo = Db.Foos.Where(x=> x.HurrEnum == Hurr.Durr); 

probablemente resultará en toda la tabla Foos ser llevado en la memoria y luego analizada. ¡Esta propiedad es para su comodidad y debe usarse solo después de que la base de datos se haya visto afectada! Tales como:

// this is executed in the sql server 
var foo = Db.Foos.Where(x=> x.Hurr == 1 || x.Hurr == 2).ToArray(); 
// this is then done in memory 
var hurrFoos = foo.Where(x=> x.HurrEnum == Hurr.Durr); 

Si usted no entiende la diferencia es que aquí entonces usted está jugando con fuego. Debe aprender cómo EF/L2S interpreta su código y lo convierte en sentencias SQL.

+0

Por cierto, el enlace es a una pregunta del foro msdn que es respondida por Daniel Simmons, quien es desarrollador principal en EF4. – Will

+0

¿Esto le permite usar esto en una consulta? '.Where (x => x.HurrEnum = MyEnum.Foo);'? –

+2

Claro, puedes hacer eso. Sin embargo, esa consulta no se convertirá (90% seguro) en sql. Mi truco es solo por conveniencia. Si quieres la cláusula where para convertirla en sql, deberás usar la int. De lo contrario, puede lanzar o la cláusula where se ejecutará en la memoria en lugar de en sql. – Will

Cuestiones relacionadas