List <enum>类型的EF属性未在db </enum>中创建

时间:2015-02-10 10:58:39

标签: c# entity-framework enums

我正在使用代码优先EF开发ASP.NET MVC5应用程序。我的代码:

public enum Language : byte
{
    [Display(Name = "Turkmen")]
    TKM = 1,
    [Display(Name = "Russian")]
    RUS = 2,
    [Display(Name = "Chineese")]
    CHN = 3,
    [Display(Name = "English")]
    ENG = 4
}

我的模特课是:

public class Person
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int PersonID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Surname { get; set; }

    public virtual List<Enums.Language> Languages { get; set; }

    public Person()
    {
        Languages = new List<Enums.Language>();
    }
}

在VS 2013中的包管理器控制台中构建应用程序和Update-Database之后,我找不到Persons语言的引用表。我认为应该创建一个名为Person_Languages(或类似)且PersonIDLanguageID的表格。我错了或错过了什么?

2 个答案:

答案 0 :(得分:6)

我无法清楚地引用我的回复,但是:枚举不是一个类,所以它不能成为一个实体。

在你的情况下,你必须创建一个语言类:

public class CLanguage
{
    public Int32 Id { get; set; }
    public Language Lang { get; set; }
}

然后:

public class Person
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int PersonID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Surname { get; set; }

    public virtual ICollection<CLanguage> Languages { get; set; }

    public Person()
    {
        Languages = new List<CLanguage>();
    }
}

请注意使用ICollection代替列表进行合规。

您可能还希望将枚举属性用作PK。

public class CLanguage
{
    [Key]    
    public Language Lang { get; set; }
}

答案 1 :(得分:6)

使用Flag Enum。你不需要任何额外的表格。它要快得多。

在您的模型中,您可以

var person = new Person();
p.Languages.Add(Language.TKM);
p.Languages.Add(Language.TKM);

......这是错的。有了旗帜你会喜欢那样

p.Languages = Language.TKM | Language.RUS;

http://blog.falafel.com/entity-framework-enum-flags/