惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
罗磊的独立博客
F
Fortinet All Blogs
T
Threatpost
Y
Y Combinator Blog
博客园_首页
美团技术团队
Security Latest
Security Latest
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
V
V2EX - 技术
The Cloudflare Blog
L
LINUX DO - 热门话题
博客园 - 司徒正美
Jina AI
Jina AI
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
The Hacker News
The Hacker News
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Latest news
Latest news
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
雷峰网
雷峰网
Application and Cybersecurity Blog
Application and Cybersecurity Blog
B
Blog RSS Feed
W
WeLiveSecurity
D
DataBreaches.Net
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
TaoSecurity Blog
TaoSecurity Blog
S
Securelist
Help Net Security
Help Net Security

博客园 - Magic.Z

几种可能使 Windows 7 睡眠后自动唤醒的原因 IIS 7.5 下载文件遇到 404.3 试用 Entity Framework Power Tools CTP1 通过 WebBrowser 获取网页截图 WPF 客户端上传文件到 ASP.NET MVC 网站 开启 IE9 导航声音 WPF 实现屏幕文字提示 - Magic.Z - 博客园 AJAX 网页保留浏览器前进后退等功能 ADO.NET Entity Framework Feature 中的 CodeFirst 创建数据库和实体类 赠送 MSDN 订阅激活卡 在 ASP.NET WebForm 中使用 Route 在 ASP.NET MVC 中创建自定义 HtmlHelper 注意防范ASP.NET中可能导致信息泄漏的漏洞 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds 用 Windows Media Center 浏览互联网视频 WebMatrix 简介 打印网页中的 GridView - Magic.Z ASP.NET 网站后台任务 Visual Studio 2010 中的 MSDN 帮助文档
在 ADO.NET Entity Framework 4 中使用枚举
Magic.Z · 2010-04-19 · via 博客园 - Magic.Z

枚举(Enum)是一种常用的类型,如用于表示状态、类型等参数。但目前它不会被官方地在ADO.NET Entity Framework中进行支持。本文介绍的是通过复杂类型(Complex Types)在ADO.NET Entity Framework 4中使用枚举。
这种方法需要使用POCO类,而不能使用Visual Studio自动生成的类。因为我们需要手动为复杂类型编写代码。

数据库脚本:

代码

 1 if exists (select 1
 2             from  sysobjects
 3            where  id = object_id('Account')
 4             and   type = 'U')
 5    drop table Account
 6 go
 7 
 8 create table Account (
 9    ID                   uniqueidentifier     not null default NewSequentialID(),
10    UserName             nvarchar(20)         not null,
11    Password             varchar(40)          not null,
12    Email                nvarchar(100)        not null,
13    Role                 int                  not null,
14    constraint PK_ACCOUNT primary key (ID)
15 )
16 
17 insert into Account (UserName ,Password,Email ,Role ) values ('Test1','Test1','test1',1)
18 insert into Account (UserName ,Password,Email ,Role ) values ('Test2','Test2','test2',1)
19 insert into Account (UserName ,Password,Email ,Role ) values ('Test3','Test3','test3',2)

这是一个用于存放帐号信息的数据表,Role是个枚举类型,在数据库中用int类型。
我们按常规做法写一个用于表示Role的枚举类型

1 public enum AccountRoleEnum
2 {
3     Admin = 1,
4     User = 2
5 }

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

代码

 1 public partial class RoleWrapper
 2 {
 3     private AccountRoleEnum m_orderStatus;
 4 
 5     public int Value
 6     {
 7         get { return (int)m_orderStatus; }
 8         set { m_orderStatus = (AccountRoleEnum)value; }
 9     }
10 
11     public AccountRoleEnum EnumValue
12     {
13         get { return m_orderStatus; }
14         set { m_orderStatus = value; }
15     }
16 
17     public static implicit operator RoleWrapper(AccountRoleEnum role)
18     {
19         return new RoleWrapper { EnumValue = role };
20     }
21 
22     public static implicit operator AccountRoleEnum(RoleWrapper role)
23     {
24         if (role == null)
25             return AccountRoleEnum.User;
26         return role.EnumValue;
27     }
28 }

最后的2个方法用于隐式类型重载,也就是对类型进行变换。
然后我们写Account实体。

代码

 1 public class Account
 2 {
 3     public Guid ID { getset; }
 4 
 5     public string UserName { getset; }
 6 
 7     public string Password { getset; }
 8 
 9     public string Email { getset; }
10 
11     public RoleWrapper Role { getset; }
12 }

和实体框架上下文。

代码

 1 public class EntitiesContext : ObjectContext
 2 {
 3     public EntitiesContext()
 4         : base("name=Entities""Entities")
 5     {
 6         _accounts = CreateObjectSet<Account>();
 7     }
 8 
 9     public ObjectSet<Account> Accounts
10     {
11         get
12         {
13             return _accounts;
14         }
15     }
16     private ObjectSet<Account> _accounts;
17 }

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

1 account.Role == AccountRoleEnum.Admin

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

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

参考文章

http://blogs.msdn.com/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx
http://blogs.msdn.com/alexj/archive/2009/06/05/tip-23-how-to-fake-enums-in-ef-4.aspx