枚舉(Enum)是一種常用的類型,如用於表示狀態、類型等參數。但目前它不 會被官方地在ADO.NET Entity Framework中進行支持。本文介紹的是通過復雜類 型(Complex Types)在ADO.NET Entity Framework 4中使用枚舉。
這種方法需要使用POCO類,而不能使用Visual Studio自動生成的類。因為我 們需要手動為復雜類型編寫代碼。
數據庫腳本:
1 if exists (select 1
2 from sysobjects
3 where id = object_id ('Account')
4 and type = 'U')
5 drop table Account
6 go
7
8 create table Account (
9 ID uniqueidentifier not null default NewSequentialID(),
10 UserName nvarchar(20) not null,
11 Password varchar(40) not null,
12 Email nvarchar(100) not null,
13 Role int not null,
14 constraint PK_ACCOUNT primary key (ID)
15 )
16
17 insert into Account (UserName ,Password,Email ,Role ) values ('Test1','Test1','test1',1)
18 insert into Account (UserName ,Password,Email ,Role ) values ('Test2','Test2','test2',1)
19 insert into Account (UserName ,Password,Email ,Role ) values ('Test3','Test3','test3',2)
這是一個用於存放帳號信息的數據表,Role是個枚舉類型,在數據庫中用int 類型。
我們按常規做法寫一個用於表示Role的枚舉類型
1 public enum AccountRoleEnum
2 {
3 Admin = 1,
4 User = 2
5 }
然後寫一個復雜類型用於在枚舉類型和數據庫的int類型之間做變換。復雜類 型只有在ADO.NET Entity Framework 4中才有。
1 public partial class RoleWrapper
2 {
3 private AccountRoleEnum m_orderStatus;
4
5 public int Value
6 {
7 get { return (int) m_orderStatus; }
8 set { m_orderStatus = (AccountRoleEnum)value; }
9 }
10
11 public AccountRoleEnum EnumValue
12 {
13 get { return m_orderStatus; }
14 set { m_orderStatus = value; }
15 }
16
17 public static implicit operator RoleWrapper(AccountRoleEnum role)
18 {
19 return new RoleWrapper { EnumValue = role };
20 }
21
22 public static implicit operator AccountRoleEnum(RoleWrapper role)
23 {
24 if (role == null)
25 return AccountRoleEnum.User;
26 return role.EnumValue;
27 }
28 }
最後的2個方法用於隱式類型重載,也就是對類型進行變換。
然後我們寫Account實體。
1 public class Account
2 {
3 public Guid ID { get; set; }
4
5 public string UserName { get; set; }
6
7 public string Password { get; set; }
8
9 public string Email { get; set; }
10
11 public RoleWrapper Role { get; set; }
12 }
和實體框架上下文。
1 public class EntitiesContext : ObjectContext
2 {
3 public EntitiesContext()
4 : base("name=Entities", "Entities")
5 {
6 _accounts = CreateObjectSet<Account>();
7 }
8
9 public ObjectSet<Account> Accounts
10 {
11 get
12 {
13 return _accounts;
14 }
15 }
16 private ObjectSet<Account> _accounts;
17 }
這樣,主要的工作就已經完成了,在比較時可以使用
1 account.Role == AccountRoleEnum.Admin
但是在涉及到數據庫的查詢時,這樣的寫法是會報錯的,只能使用
1 EntitiesContext db = new EntitiesContext();
2 db.Accounts.Where(c => c.Role.Value == (int) AccountRoleEnum.Admin);