8

質問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;}
}

ここで、GenderとEducationLevelは次のような列挙型です。

public enum Gender {Male,Female,Undisclosed}
public enum EducationLevel {HighSchool,Bachelors,Masters,Doctorate}

次の場合、候補者クラスと性別および教育レベルをEF4で機能させるにはどうすればよいですか。

  • モデルファースト開発を行います
  • 私はdbの最初の開発を行います

編集:オブジェクトコンテキストに関連する質問をここの別の質問に移動しました。

4

1 に答える 1

16

どうやらint <-> enum EF4の最初のリリースではサポートされないようです。私はこれが悪いと言う人たちに同意します。

キャスティングを行うプロパティを使用しています

public partial class MyEntity
{
  public MyEnum HurrEnum {get{return (MyEnum)Hurr;} set{Hurr = (int)value;}}
}

ものに「正しく」名前を付ければ、それほど悪くはありません(つまり、ばかげているようには見えません)。たとえば、データベースにReasonとして格納されているReasonCode列挙型があるため、プロパティのReasonバージョンとReasonCodeバージョンがあります。今のところ、十分に機能します。


まず、EF4を使い始めたばかりなので、EF4の仕組みに詳しくありません。L2Sに似ていますが、エンティティのサポートが優れていると思います。これを一粒の塩と一緒に取ってください。

明確にするために、このプロパティは便宜上のものであり、このプロパティを使用してデータベースにクエリを実行しようとすると、EFが正しく反応しないと90%確信しています。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ステートメントに変換する方法を学ぶ必要があります。

于 2010-01-14T16:31:29.473 に答える