标题 | ADO.NET Entity Framework 4中枚举的使用 |
内容 | 本文将通过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(); } public ObjectSet Accounts { get { return _accounts; } } private ObjectSet _accounts; } 这样,主要的工作就已经完成了,在比较时可以使用 account.Role == AccountRoleEnum.Admin 但是在涉及到数据库的查询时,这样的写法是会报错的,只能使用 EntitiesContext db = new EntitiesContext(); db.Accounts.Where(c => c.Role.Value == (int)AccountRoleEnum.Admin); |
随便看 |
|
在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。