好的,问题是这样的。我有多个使用枚举属性的模型,除了其中一个,我对此没有任何问题。然而,在此模型中,代码首先无法识别此属性,并且不会在相应的表中创建列。奇怪的是,我有一个与无法正常工作的模型非常相似的模型,唯一的区别是它位于不同的命名空间中。
我会补充一点:
- 我的项目的目标是 .NET 4.5(实际上功能和非功能模型在同一个项目中)。
- 我正在使用实体框架 5
- 我的枚举在命名空间中公开定义,而不是嵌套在类中。
这消除了尝试在 EF 中使用枚举时最常见的问题原因。
以下是代码片段,首先是无效的:
public enum Commodities
{
Test1,
Test2,
Test3
}
[Table("Suppliers")]
public class Suppliers
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Required]
[MaxLength(7)]
[Display(Name = "Vendor ID")]
public string VendorID { get; set; }
[Required]
[Display(Name = "Supplier Name")]
public string SupplierName { get; set; }
public Commodities Commodity { get; set; }
public bool Visible { get; set; }
}
现在这是一个可以正常工作的版本,唯一的区别是它位于不同的命名空间和类文件中(两者都位于同一个项目中并且具有相同的 using 声明):
public enum Commodities
{
Test4,
Test5,
Test6
}
[Table("Buyers")]
public class Buyer
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Display(Name = "Buyer ID")]
[Required]
public string BuyerID { get; set; }
[Display(Name = "Buyer Name")]
[Required]
public string Name { get; set; }
[Display(Name = "Windows Logon ID")]
public string WinUserID { get; set; }
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Please enter a valid e-mail adress")]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email address")]
public string Email { get; set; }
public Commodities Commodity { get; set; }
[Display(Name = "Active?")]
public Boolean IsActive { get; set; }
}
在“Buyer”表代码中,首先正确初始化 Commodity 列并将其映射到模型中的枚举。然而,在“供应商”表中,它仅使用以下列进行初始化:VendorID、VendorName 和 Visible,商品无处可寻。我的问题是为什么会发生这种情况,我该怎么做才能解决它?我对此束手无策。
编辑:似乎问题可能与使用两个具有相同名称的枚举有关。尽管编译器没有对歧义的抱怨(也不应该因为它们存在于不同的命名空间中),但似乎 EF 不喜欢它。更改枚举之一的名称会导致 CF 识别该属性。