熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

詳解ADO.NET Entity Framework 4中枚舉的使用

2013-11-13 10:05:14  來源: .NET編程 

  本文將通過ADONET Entity Framework 中枚舉的使用介紹帶領大家走進ADONET的世界

  枚舉(Enum)是一種常用的類型如用於表示狀態類型等參數但目前它不會被官方地在ADONET Entity Framework中進行支持本文介紹的是通過復雜類型(Complex Types)在ADONET Entity Framework 中使用枚舉

  這種方法需要使用POCO類而不能使用Visual Studio自動生成的類因為我們需要手動為復雜類型編寫代碼

  數據庫腳本

  if exists (select

  from  sysobjects

  where  id = object_id(Account)

  and   type = U)

  drop table Account   go      create table Account

  (

  ID     uniqueidentifier     not null default NewSequentialID()

  UserName       nvarchar()         not null

  Password      varchar()          not null

  Email           nvarchar()        not null

  Role                 int            not null

  constraint PK_ACCOUNT primary key (ID)

  )

  insert into Account (UserName PasswordEmail Role ) values (TestTesttest)

  insert into Account (UserName PasswordEmail Role ) values (TestTesttest)

  insert into Account (UserName PasswordEmail Role ) values (TestTesttest)

  這是一個用於存放帳號信息的數據表Role是個枚舉類型在數據庫中用int類型

  我們按常規做法寫一個用於表示Role的枚舉類型

  public enum AccountRoleEnum  {

  Admin =

  User =

  }

  然後寫一個復雜類型用於在枚舉類型和數據庫的int類型之間做變換復雜類型只有在ADONET Entity Framework 中才有

  public partial class RoleWrapper

  {

  private AccountRoleEnum m_orderStatus;

  public int Value

  {

  get {

  return (int)m_orderStatus;

  }

  set {

  m_orderStatus = (AccountRoleEnum)value;

  }       }

  public AccountRoleEnum EnumValue

  {

  get {

  return m_orderStatus;

  }

  set {

  m_orderStatus = value;

  }

  }

  public static implicit operator RoleWrapper(AccountRoleEnum role)

  {

  return new RoleWrapper {

  EnumValue = role

  };

  }

  public static implicit operator AccountRoleEnum(RoleWrapper role)

  {

  if (role == null)

  return AccountRoleEnumUser;

  return roleEnumValue;

  }

  } 最後的個方法用於隱式類型重載也就是對類型進行變換

  然後我們寫Account實體

  public class Account

  {

  public Guid ID

  {

  get;

  set;

  }

  public string UserName { get; set;

  }

  public string Password

  {

  get;

  set;

  }

  public string Email

  {

  get;

  set;

  }

  public RoleWrapper Role

  {

  get;

  set;

  }  和實體框架上下文

  public class EntitiesContext : ObjectContext

  {

  public EntitiesContext()

  : base(name=Entities Entities)

  {

  _accounts = CreateObjectSet<Account>();

  }

  public ObjectSet<Account> Accounts

  {

  get

  {

  return _accounts;

  }

  }

  private ObjectSet<Account> _accounts;

  }

  這樣主要的工作就已經完成了在比較時可以使用

  accountRole == AccountRoleEnumAdmin 但是在涉及到數據庫的查詢時這樣的寫法是會報錯的只能使用

  EntitiesContext db = new EntitiesContext();  dbAccountsWhere(c => cRoleValue == (int)AccountRoleEnumAdmin);


From:http://tw.wingwit.com/Article/program/net/201311/12519.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.