程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 在ADO.NET Entity Framework 4中使用枚舉

在ADO.NET Entity Framework 4中使用枚舉

編輯:關於.NET

枚舉(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);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved