ADO.NET Entity Framework 4中枚举的使用

来源:网络时间:2011-06-23

  本文将通过ADO.NET Entity Framework 4中枚举的使用介绍,带领大家走进ADO.NET的世界。

  枚举(Enum)是一种常用的类型,如用于表示状态、类型等参数。但目前它不会被官方地在ADO.NET Entity Framework中进行支持。本文介绍的是通过复杂类型(Complex Types)在ADO.NET Entity Framework 4中使用枚举。

  这种方法需要使用POCO类,而不能使用Visual Studio自动生成的类。因为我们需要手动为复杂类型编写代码。

  数据库脚本:

  if exists (select 1

  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(20) not null,

  Password varchar(40) not null,

  Email nvarchar(100) not null,

  Role int not null,

  constraint PK_ACCOUNT primary key (ID)

  )

  insert into Account (UserName ,Password,Email ,Role ) values ('Test1','Test1','test1',1)

  insert into Account (UserName ,Password,Email ,Role ) values ('Test2','Test2','test2',1)

  insert into Account (UserName ,Password,Email ,Role ) values ('Test3','Test3','test3',2)

  这是一个用于存放帐号信息的数据表,Role是个枚举类型,在数据库中用int类型。

  我们按常规做法写一个用于表示Role的枚举类型

  public enum AccountRoleEnum {

  Admin = 1,

  User = 2

  }

  然后写一个复杂类型用于在枚举类型和数据库的int类型之间做变换。复杂类型只有在ADO.NET Entity Framework 4中才有。

  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 AccountRoleEnum.User;

  return role.EnumValue;

  }

  } 最后的2个方法用于隐式类型重载,也就是对类型进行变换。

  然后我们写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;

  }

  这样,主要的工作就已经完成了,在比较时可以使用

  account.Role == AccountRoleEnum.Admin 但是在涉及到数据库的查询时,这样的写法是会报错的,只能使用

  EntitiesContext db = new EntitiesContext(); db.Accounts.Where(c => c.Role.Value == (int)AccountRoleEnum.Admin);

发表评论

最新评论(共0条)