类型为 List<enum> 的 EF 属性 未在数据库中创建
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
}
我的模型 class 是:
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 语言的参考 table。我认为应该创建一个名称为 Person_Languages
(或类似名称)的 table 以及 PersonID
和 LanguageID
。我做错了什么或错过了什么?
我不能清楚地引用我的回复,但是:枚举不是 class,所以它不能是一个实体。
在这种情况下,您必须创建一种语言 class:
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; }
}
使用标志枚举。您不需要任何额外的表。它要快得多。
在你的模型中你可以做
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;
我正在使用代码优先 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
}
我的模型 class 是:
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 语言的参考 table。我认为应该创建一个名称为 Person_Languages
(或类似名称)的 table 以及 PersonID
和 LanguageID
。我做错了什么或错过了什么?
我不能清楚地引用我的回复,但是:枚举不是 class,所以它不能是一个实体。
在这种情况下,您必须创建一种语言 class:
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; }
}
使用标志枚举。您不需要任何额外的表。它要快得多。
在你的模型中你可以做
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;