【问题标题】:EF property of type List<enum> not created in db未在 db 中创建 List<enum> 类型的 EF 属性
【发布时间】:2015-02-10 10:58:39
【问题描述】:

我正在使用代码优先 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 的包管理器控制台中构建应用程序和更新数据库后,我找不到 Persons 语言的参考表。我认为应该创建一个名称为Person_Languages(或类似名称)和PersonIDLanguageID 的表。我做错了什么或错过了什么?

【问题讨论】:

标签: c# entity-framework enums


【解决方案1】:

使用标志枚举。您不需要任何额外的表格。它要快得多。

在你的模型中你可以这样做

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

...这是错误的。有了flag,你就会这样做

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

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

【讨论】:

    【解决方案2】:

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

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

    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 以确保合规性。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2010-11-30
      • 2022-01-14
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多