【问题标题】:Using ADO.net Entity Framework 4 with Enumerations? How do I do it?将 ADO.net Entity Framework 4 与枚举一起使用?我该怎么做?
【发布时间】:2011-01-05 03:43:49
【问题描述】:

问题 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开发

编辑:将与对象上下文相关的问题移至另一个问题here

【问题讨论】:

    标签: entity-framework ado.net enums poco entity-framework-4


    【解决方案1】:

    显然是int <-> enumwon't be supported in the initial release of EF4。我同意那些说这很糟糕的人的观点。

    我正在使用一个为我进行强制转换的属性

    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 语句。

    【讨论】:

    • 顺便说一句,该链接指向一个 msdn 论坛问题,该问题由 EF4 开发主管 Daniel Simmons 回答。
    • 这是否允许您在查询中使用它? .Where(x => x.HurrEnum = MyEnum.Foo);?
    • 当然可以。但是,该查询不会(90% 肯定)被转换为 sql。我的黑客只是为了方便。如果您希望 where 子句将其变为 sql,则必须使用 int。否则,它可能会抛出或者 where 子句将在内存中而不是在 sql 中执行。
    • 谢谢,据我所知,EF 总是会抛出异常,我没有看到它在内存中执行部分查询,因为它无法映射到 SQL 跨度>
    • 这太糟糕了!我希望它能在.net 4 版本中实现。如果不能使用枚举,就说“我们支持 POCO”是没有意义的,在某些情况下,即使元组作为 POCO 的一部分也应该开箱即用。跛脚!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多