本文将通过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);