问题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一起使用?
编辑:将与对象上下文相关的问题移至另一个问题here。
答案 0 :(得分:16)
显然int <-> enum
won'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语句。