さて、問題はこれです。列挙型プロパティを使用する複数のモデルがありますが、そのうちの 1 つを除いて、これで問題はありませんでした。ただし、このモデルでは、コードはまずこのプロパティを認識せず、それぞれのテーブルに列を作成しません。奇妙なのは、正常に動作する機能していないモデルと非常によく似たモデルを持っていることです。唯一の違いは、それが別の名前空間にあることです。
私はそれを追加します:
- 私のプロジェクトは .NET 4.5 をターゲットにしています (実際、機能するモデルと機能しないモデルは同じプロジェクト内にあります)。
- Entity Framework 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 列を正しく初期化し、それをモデルの列挙型にマップします。ただし、「Suppliers」テーブルでは、VendorID、VendorName、および Visible with Commodity no where to be found の列でのみ初期化されます。私の質問は、なぜこれが起こっているのか、それを修正するにはどうすればよいですか? 私はこれで頭がいっぱいです。
編集:問題は、同じ名前の2つの列挙型を使用することに関係しているようです。コンパイラはあいまいさについて何の不満も持っていませんが (異なる名前空間に存在するため、そうあるべきではありません)、EF はそれを好まないようです。いずれかの列挙型の名前を変更すると、CF がそのプロパティを認識します。