2011-06-14 51 views
33

在EF代码优先中使用枚举是否有标准方法?似乎有一些例子使用enum的包装类。枚举与EF代码优先 - 标准方法播种DB然后使用?

但是,我想能够定义枚举并使用数据库初始值设定项将枚举值也播种到数据库中。如果我必须从枚举中手动生成数据库表,那么定义枚举和创建包装器似乎没有多大意义。

+6

如果你想枚举与键值对分开的表,那么它不是枚举了,它成为标准关系。 – 2011-06-14 14:24:18

回答

18

现在支持:http://blogs.msdn.com/b/adonet/archive/2011/06/30/announcing-the-microsoft-entity-framework-june-2011-ctp.aspx

微软实体框架2011年6月CTP引入了两个新的运行和设计时间功能。下面是一些新的运行时功能:

  • 枚举数据类型现在是在实体框架可用。您可以使用Visual Studio中的Entity Designer对具有Enum属性的实体进行建模,也可以使用Code First工作流定义具有Enum对象作为属性的实体。您可以使用枚举属性,就像任何其他标量属性,如在LINQ查询和更新...

有用于Visual Studio中的Entity Framework设计了一些新的特点:

  • 的实体设计现在支持枚举,空间数据类型和表值函数从设计师表面的创作...
+5

大家知道,EF 4.2不支持它(女巫可在NuGet中使用)自2011年6月以来,CTP使用.net 4.5功能构建,因此您必须按照以下链接中的说明更改应用程序的范围。 – VinnyG 2011-10-20 13:15:29

70

不幸的是,在EF 4.1上本机不支持enums。以下是一篇颇有名气的文章:如何处理它们:Faking enums on EF 4。但是,它确实需要一个包装。

但是,有一种简单的方法可以在EF 4中映射枚举:只需在您的类上创建一个int属性来表示枚举的int值。这是EF应该映射的属性,然后有一个“迷你包装器”属性允许您使用枚举。

public class Appointment 
{ 
    public int ID { get; set; } 
    public string Description { get; set; } 

    // This property will be mapped 
    public int DayOfWeekValue { get; set; } 

    public DayOfWeek Day 
    { 
     get { return (DayOfWeek) DayOfWeekValue; } 
     set { DayOfWeekValue = (int) value; } 
    } 
} 

public enum DayOfWeek 
{ 
    Monday, 
    Tuesday, 
    Wednesday, 
    Thursday, 
    Friday, 
    Saturday, 
    Sunday 
} 

在生成数据库时,EF会高兴地忽略任何不知道如何映射的类型,但是int属性将被映射。

注:这是直接取自我的回答另一个enumEF问题:EF 4.1 Code First - map enum wrapper as complex type

+0

怎么样使用codefirst/initialisers在数据库中播种类型。我是否需要手动将枚举与插入自己绑定? – jaffa 2011-06-14 13:40:36

+0

@jaffa - 你可以添加一些代码,如何你最好能够初始化数据库?然后我们可以从那里工作。 – 2011-06-14 13:42:40

+0

@Sergi - 在我做之前,也许我误解了一些东西。你的颜色类型,这只是你的代码内部的东西,还是在数据库中有1-Red,2-Blue,3-Green等的底层表格......? – jaffa 2011-06-14 14:07:48