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一起使用:
编辑:到对象上下文的另一个问题有关的问题已移动在这里.
小智 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语句.
| 归档时间: |
|
| 查看次数: |
4679 次 |
| 最近记录: |