簡體   English   中英

列表類型的EF屬性 <enum> 不是在數據庫中創建

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

我正在使用代碼優先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 我錯了什么或錯過了什么?

使用標志枚舉。 您不需要任何其他表格。 它要快得多。

在您的模型中,您可以

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

...這是錯誤的。 帶有標志,你會那樣做

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

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

我無法明確引用我的回答,但是:枚舉不是類,因此它不能是實體。

在這種情況下,您必須創建一個語言類:

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而不是List來實現合規性。

您可能還想將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