Entity framework 使用带有枚举的ADO.net实体框架4?我该怎么做?

Entity framework 使用带有枚举的ADO.net实体框架4?我该怎么做?,entity-framework,ado.net,enums,poco,entity-framework-4,Entity Framework,Ado.net,Enums,Poco,Entity Framework 4,问题1:我在玩EF4,我有一个模型课,比如: public class Candidate { public int Id {get;set;} public string FullName {get;set;} public Gender Sex {get;set;} public EducationLevel HighestDegreeType {get;set;} } 这里的性别和教育水平如下所示: public enum Gender {Male,Female,Undisclosed

问题1:我在玩EF4,我有一个模型课,比如:

public class Candidate {

public int Id {get;set;}
public string FullName {get;set;}
public Gender Sex {get;set;}
public EducationLevel HighestDegreeType {get;set;}
}
这里的性别和教育水平如下所示:

public enum Gender {Male,Female,Undisclosed}
public enum EducationLevel {HighSchool,Bachelors,Masters,Doctorate}
如果满足以下条件,我如何让候选人的班级、性别和教育水平与EF4一起工作:

  • 我做模型优先开发
  • 我做db第一次开发
编辑:将与对象上下文相关的问题移动到另一个问题。

显然
int enum
4。我同意那些说这很糟糕的人

我正在使用一个属性为我进行铸造

public partial class MyEntity
{
  public MyEnum HurrEnum {get{return (MyEnum)Hurr;} set{Hurr = (int)value;}}
}
如果你把东西命名为“正确的”(也就是说,这样看起来就不那么愚蠢了)。例如,我有一个作为原因存储在数据库中的ReasonCode枚举,因此我有属性的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语句。

BTW,链接指向msdn论坛的问题,该问题由EF4开发负责人Daniel Simmons回答。这是否允许您在查询中使用此问题<代码>其中(x=>x.HurrEnum=MyEnum.Foo)?当然可以。但是,该查询(90%确定)不会转换为sql。我的黑客只是为了方便。如果你想让where子句变成sql,你必须使用int。否则,它可能会抛出,或者where子句将在内存中执行,而不是在sql中执行。多亏了这一点,据我所知,EF总是抛出,我没有看到它在内存中执行查询的一部分,因为它无法映射到SQLThis sucks!我希望它能在.NET4版本中发布。在不能使用枚举的情况下说“我们支持POCO”是没有意义的,甚至元组在某些情况下也应该作为POCO的一部分开箱即用。瘸的