2010-01-14 77 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