简体   繁体   English

列表类型的EF属性 <enum> 不是在数据库中创建

[英]EF property of type List<enum> not created in db

I'm developing an ASP.NET MVC5 application using code first EF. 我正在使用代码优先EF开发ASP.NET MVC5应用程序。 My code: 我的代码:

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

And my model class is: 我的模型课是:

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>();
    }
}

After I build application and Update-Database in package manager console in VS 2013 I can not find a reference table for Persons languages. 在VS 2013中的软件包管理器控制台中构建应用程序和Update-Database之后,找不到Persons语言的参考表。 I thought a table with a name Person_Languages (or similar) with PersonID and LanguageID should be created. 我认为应该创建一个名为Person_Languages (或类似名称), PersonIDLanguageID What did I wrong or missed? 我错了什么或错过了什么?

Use Flag Enum. 使用标志枚举。 You don't need any additional tables. 您不需要任何其他表格。 It is much more faster. 它要快得多。

In your model you can do 在您的模型中,您可以

var person = new Person();
p.Languages.Add(Language.TKM);
p.Languages.Add(Language.TKM); // Add the same language twice

... which is wrong. ...这是错误的。 With flag you will do like that 带有标志,你会那样做

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

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

I can't clearly reference my response but: an enum is not a class so it can't be an entity. 我无法明确引用我的回答,但是:枚举不是类,因此它不能是实体。

In you case you have to create a language class: 在这种情况下,您必须创建一个语言类:

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

and then: 接着:

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>();
    }
}

Please note the use of ICollection instead of List for compliance. 请注意使用ICollection而不是List来实现合规性。

You may also want to use the enum property as PK. 您可能还想将enum属性用作PK。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM