本文将通过ADO.NET Entity Framework 4中枚举的使用介绍,带领大家走进ADO.NET的世界。5AjHTML5中文学习网 - HTML5先行者学习网
枚举(Enum)是一种常用的类型,如用于表示状态、类型等参数。但目前它不会被官方地在ADO.NET Entity Framework中进行支持。本文介绍的是通过复杂类型(Complex Types)在ADO.NET Entity Framework 4中使用枚举。5AjHTML5中文学习网 - HTML5先行者学习网
这种方法需要使用POCO类,而不能使用Visual Studio自动生成的类。因为我们需要手动为复杂类型编写代码。5AjHTML5中文学习网 - HTML5先行者学习网
数据库脚本:5AjHTML5中文学习网 - HTML5先行者学习网
if exists (select 15AjHTML5中文学习网 - HTML5先行者学习网
from sysobjects5AjHTML5中文学习网 - HTML5先行者学习网
where id = object_id('Account')5AjHTML5中文学习网 - HTML5先行者学习网
and type = 'U')5AjHTML5中文学习网 - HTML5先行者学习网
drop table Account go create table Account5AjHTML5中文学习网 - HTML5先行者学习网
(5AjHTML5中文学习网 - HTML5先行者学习网
ID uniqueidentifier not null default NewSequentialID(),5AjHTML5中文学习网 - HTML5先行者学习网
UserName nvarchar(20) not null,5AjHTML5中文学习网 - HTML5先行者学习网
Password varchar(40) not null,5AjHTML5中文学习网 - HTML5先行者学习网
Email nvarchar(100) not null,5AjHTML5中文学习网 - HTML5先行者学习网
Role int not null,5AjHTML5中文学习网 - HTML5先行者学习网
constraint PK_ACCOUNT primary key (ID)5AjHTML5中文学习网 - HTML5先行者学习网
)5AjHTML5中文学习网 - HTML5先行者学习网
insert into Account (UserName ,Password,Email ,Role ) values ('Test1','Test1','test1',1)5AjHTML5中文学习网 - HTML5先行者学习网
insert into Account (UserName ,Password,Email ,Role ) values ('Test2','Test2','test2',1)5AjHTML5中文学习网 - HTML5先行者学习网
insert into Account (UserName ,Password,Email ,Role ) values ('Test3','Test3','test3',2)5AjHTML5中文学习网 - HTML5先行者学习网
这是一个用于存放帐号信息的数据表,Role是个枚举类型,在数据库中用int类型。5AjHTML5中文学习网 - HTML5先行者学习网
我们按常规做法写一个用于表示Role的枚举类型5AjHTML5中文学习网 - HTML5先行者学习网
public enum AccountRoleEnum {5AjHTML5中文学习网 - HTML5先行者学习网
Admin = 1,5AjHTML5中文学习网 - HTML5先行者学习网
User = 25AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
然后写一个复杂类型用于在枚举类型和数据库的int类型之间做变换。复杂类型只有在ADO.NET Entity Framework 4中才有。5AjHTML5中文学习网 - HTML5先行者学习网
public partial class RoleWrapper5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
private AccountRoleEnum m_orderStatus;5AjHTML5中文学习网 - HTML5先行者学习网
public int Value5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
get {5AjHTML5中文学习网 - HTML5先行者学习网
return (int)m_orderStatus;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
set {5AjHTML5中文学习网 - HTML5先行者学习网
m_orderStatus = (AccountRoleEnum)value;5AjHTML5中文学习网 - HTML5先行者学习网
} }5AjHTML5中文学习网 - HTML5先行者学习网
public AccountRoleEnum EnumValue5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
get {5AjHTML5中文学习网 - HTML5先行者学习网
return m_orderStatus;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
set {5AjHTML5中文学习网 - HTML5先行者学习网
m_orderStatus = value;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
public static implicit operator RoleWrapper(AccountRoleEnum role)5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
return new RoleWrapper {5AjHTML5中文学习网 - HTML5先行者学习网
EnumValue = role5AjHTML5中文学习网 - HTML5先行者学习网
};5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
public static implicit operator AccountRoleEnum(RoleWrapper role)5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
if (role == null)5AjHTML5中文学习网 - HTML5先行者学习网
return AccountRoleEnum.User;5AjHTML5中文学习网 - HTML5先行者学习网
return role.EnumValue;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
} 最后的2个方法用于隐式类型重载,也就是对类型进行变换。5AjHTML5中文学习网 - HTML5先行者学习网
然后我们写Account实体。5AjHTML5中文学习网 - HTML5先行者学习网
public class Account5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
public Guid ID5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
get;5AjHTML5中文学习网 - HTML5先行者学习网
set;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
public string UserName { get; set;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
public string Password5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
get;5AjHTML5中文学习网 - HTML5先行者学习网
set;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
public string Email5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
get;5AjHTML5中文学习网 - HTML5先行者学习网
set;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
public RoleWrapper Role5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
get;5AjHTML5中文学习网 - HTML5先行者学习网
set;5AjHTML5中文学习网 - HTML5先行者学习网
} 和实体框架上下文。5AjHTML5中文学习网 - HTML5先行者学习网
public class EntitiesContext : ObjectContext5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
public EntitiesContext()5AjHTML5中文学习网 - HTML5先行者学习网
: base("name=Entities", "Entities")5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
_accounts = CreateObjectSet();5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
public ObjectSet Accounts5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
get5AjHTML5中文学习网 - HTML5先行者学习网
{5AjHTML5中文学习网 - HTML5先行者学习网
return _accounts;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
private ObjectSet _accounts;5AjHTML5中文学习网 - HTML5先行者学习网
}5AjHTML5中文学习网 - HTML5先行者学习网
这样,主要的工作就已经完成了,在比较时可以使用5AjHTML5中文学习网 - HTML5先行者学习网
account.Role == AccountRoleEnum.Admin 但是在涉及到数据库的查询时,这样的写法是会报错的,只能使用5AjHTML5中文学习网 - HTML5先行者学习网
EntitiesContext db = new EntitiesContext(); db.Accounts.Where(c => c.Role.Value == (int)AccountRoleEnum.Admin);5AjHTML5中文学习网 - HTML5先行者学习网