Использование ADO.net Entity Framework 4 с перечислениями? Как мне это сделать? - PullRequest
8 голосов
/ 14 января 2010

Вопрос 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 and EducationLevel - это Enums вроде:

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

Как заставить Кандидатский класс и Gender and EducationLevel работать с EF4, если:

  • Я делаю модель первой разработки
  • Я делаю дб первой разработки

Редактировать: перенесен вопрос, связанный с контекстом объекта, на другой вопрос здесь .

1 Ответ

16 голосов
/ 14 января 2010

Очевидно, int <-> enum не будет поддерживаться в первоначальном выпуске 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.

...