我正在使用代码优先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
(或类似)且PersonID
和LanguageID
的表格。我错了或错过了什么?
答案 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;