将ADO.net实体框架4与枚举一起使用?我该怎么做?

Per*_*der 8 ado.net enums entity-framework 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;}
}
Run Code Online (Sandbox Code Playgroud)

性别和教育水平是这样的枚举:

public enum Gender {Male,Female,Undisclosed}
public enum EducationLevel {HighSchool,Bachelors,Masters,Doctorate}
Run Code Online (Sandbox Code Playgroud)

如果符合以下条件,如何让候选人班级,性别和教育级别与EF4一起使用:

  • 我做模型第一次开发
  • 我做db首先开发

编辑:到对象上下文的另一个问题有关的问题已移动在这里.

小智 16

int <-> enum 在EF 4 的初始版本中显然不会支持我.我同意那些说这很糟糕的人.

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

public partial class MyEntity
{
  public MyEnum HurrEnum {get{return (MyEnum)Hurr;} set{Hurr = (int)value;}}
}
Run Code Online (Sandbox Code Playgroud)

如果你"正确地"命名东西(这意味着它看起来并不愚蠢),它看起来并不那么糟糕.例如,我有一个ReasonCode枚举,它在数据库中存储为Reason,因此我有属性的Reason和ReasonCode版本.现在工作得很好.


首先,我刚刚开始使用EF4,所以我对它的工作方式并不熟悉.我认为它类似于L2S但具有更好的实体支持.带上一粒盐.

为了清楚起见,这个属性是为了方便起见,我90%肯定如果你试图使用这个属性查询数据库,EF会反应很差.EF不知道你的属性,也不能用它来构造sql.所以这:

var foo = from x in Db.Foos where x.HurrEnum == Hurr.Durr select x;
Run Code Online (Sandbox Code Playgroud)

可能无法按预期行事:

var foo = Db.Foos.Where(x=> x.HurrEnum == Hurr.Durr);
Run Code Online (Sandbox Code Playgroud)

可能会导致整个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);
Run Code Online (Sandbox Code Playgroud)

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

  • 这糟透了!我希望它能在.net 4版本中发布.在没有能够使用Enums的情况下说"我们支持POCO"是没有意义的,即使元组在某些情况下应该开箱即用,作为POCO的一部分.瘸! (3认同)
  • 当然,你可以做到这一点.但是,该查询不会(90%确定)转换为sql.我的黑客只是为了方便.如果你想让where子句进入sql,你必须使用int.否则,它可能会抛出或者where子句将在内存中而不是在sql中执行. (2认同)