c#

位置:IT落伍者 >> c# >> 浏览文章

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


发布日期:2018年12月11日
 
详解ADO.NET Entity Framework 4中枚举的使用

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

上一篇:VC.NET索引对查询条件顺序的影响

下一篇:如何扮演另一个帐号(C#实现)