2010-01-14 27 views
8

问题1:我玩弄EF4和我有一个模型类,如:在枚举中使用ADO.net Entity Framework 4?我该怎么做?

public class Candidate { 

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

这里性别和EducationLevel就像枚举:

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

如何获得候选类和性别

  • 我做模型率先发展
  • 我做d:和EducationLevel与EF4如果工作b第一次开发

编辑:将与对象上下文有关的问题转移到另一个问题here

回答

16

显然int <-> enumwon't be supported in the initial release of EF 4.我同意那些说这很糟糕的人。

我使用的是与铸塑件对我来说

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

属性它看起来并不那么糟糕,如果你的名字的东西“正确”(意思,所以它看起来并不愚蠢)。例如,我有一个ReasonCode枚举,它作为一个Reason存储在数据库中,所以我有Reason和ReasonCode版本的属性。现在工作得很好。


首先,我刚开始使用EF4所以我不亲近它是如何工作的。我认为它类似于L2S,但具有更好的实体支持。带上一粒盐吧。

要清楚的是,这个属性是为了方便,我90%确定如果你尝试使用这个属性查询数据库,EF会反应不好。 EF不知道你的财产,不能用它来构造SQL。所以这个:

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

将可能无法像预期的那样在那里的:

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

可能会导致整个FOOS表被带入内存,然后解析。 这个属性是为了方便,只有在数据库被击中后才能使用!如:

// 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); 

如果是在这里,那么你在玩火你不理解的差异。您需要了解EF/L2S如何解释您的代码并将其转换为sql语句。

+0

顺便说一下,链接是由丹尼尔西蒙斯回答的msdn论坛问题,他是开发EF4的开发人员。 – Will 2010-01-14 16:32:54

+0

这是否允许您在查询中使用它? '.Where(x => x.HurrEnum = MyEnum.Foo);'? – 2010-01-14 18:51:45

+2

当然,你可以做到这一点。但是,该查询不会(90%肯定)转换为sql。我的黑客只是为了方便。如果你想让where子句成为sql,你必须使用int。否则,它可能会抛出或where子句将在内存中而不是在sql中执行。 – Will 2010-01-14 22:00:20