<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_成长的足迹.NET</title><subtitle type="text">我的.NET成长之路</subtitle><id>http://feed.cnblogs.com/blog/u/22787/rss</id><updated>2012-04-13T05:22:08Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/22787/rss"/><entry><id>http://www.cnblogs.com/ejiyuan/archive/2012/02/29/2373683.html</id><title type="text">使用EF4.3构造一个清爽的基于POCO的ORM架构</title><summary type="text">EF正在成为一个优秀的ORM框架，4.1中就加入了Code First，当时带来的不少的惊喜，可是，4.1时，的Code First虽然可以不再依赖edmx，可是建立很多的，映射code,虽然这些code有工具可以自动生成，可是仍觉得解决方案混乱。今天感受了一下4.3，他可以不在依赖edmx，不再需要大量的映射code，写简单的，连接字符串，实现一个清爽的，基于POCO的ORM架构。4.3中好多东西都已被内部封装了我们只需简单的调用就好：1，定义数据操作对象///&lt;summary&gt;///定义一个DbContext///&lt;/summary&gt;publicclassBookC</summary><published>2012-02-29T09:01:00Z</published><updated>2012-02-29T09:01:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2012/02/29/2373683.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2012/02/29/2373683.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EF正在成为一个优秀的ORM框架，4.1中就加入了Code First，当时带来的不少的惊喜，可是，4.1时，的Code First虽然可以不再依赖edmx，可是建立很多的，映射code,虽然这些code有工具可以自动生成，可是仍觉得解决方案混乱。今天感受了一下4.3，他可以不在依赖edmx，不再需要大量的映射code，写简单的，连接字符串，实现一个清爽的，基于POCO的ORM架构。4.3中好多东西都已被内部封装了我们只需简单的调用就好：&lt;/p&gt;&lt;p&gt;1，定义数据操作对象&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;定义一个DbContext&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt;&amp;nbsp;BookContext&amp;nbsp;:&amp;nbsp;DbContext&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;BookContext()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;base&lt;/span&gt;(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;conString&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;定义一个DbSet对象映射到实体&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;DbSet&amp;lt;Book&amp;gt;&amp;nbsp;Books&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;2，定义实体对象&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;定义一个实体&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt;&amp;nbsp;Book&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;nbsp;BookId&amp;nbsp;{&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;&amp;nbsp;Title&amp;nbsp;{&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;double&lt;/span&gt;&amp;nbsp;Price&amp;nbsp;{&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;3，修改配置文件,添加一个简单的连接字符串&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;add&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="conString"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;nbsp;connectionString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="server=.;uid=sa;pwd=123456;database=promise"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;nbsp;providerName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="System.Data.SqlClient"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;4，Test&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;using&lt;/span&gt;&amp;nbsp;(BookContext&amp;nbsp;bc&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;BookContext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;查询&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt;&amp;nbsp;list&amp;nbsp;=&amp;nbsp;bc.Set&amp;lt;Book&amp;gt;().ToList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;添加&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;var&lt;/span&gt;&amp;nbsp;obj&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;Book()&amp;nbsp;{&amp;nbsp;BookId&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;12&lt;/span&gt;,&amp;nbsp;Price&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;10.1&lt;/span&gt;,&amp;nbsp;Title&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;其实我是一本书&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bc.Books.Add(obj);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;提交&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bc.SaveChanges();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;另外4.3中加入了对System.ComponentModel.DataAnnotations的扩展，只需在实体对象类或字段上加入相应的标记就可以定义或改变一些映射规则，如：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;指定映射到数据库的Books表中&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[System.ComponentModel.DataAnnotations.Table(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Books&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;class&lt;/span&gt;&amp;nbsp;Book&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;指定该为主键&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[System.ComponentModel.DataAnnotations.Key()]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;指定该字段不为自动编号&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[System.ComponentModel.DataAnnotations.DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;nbsp;BookId&amp;nbsp;{&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;&amp;nbsp;Title&amp;nbsp;{&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;double&lt;/span&gt;&amp;nbsp;Price&amp;nbsp;{&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果你数据中book对应的表主键不是自动编号的此标记[System.ComponentModel.DataAnnotations.DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]&amp;nbsp;&lt;/p&gt;&lt;p&gt;很重要否则无法update数据，另外其中还有大量的 验证属性。&lt;/p&gt;&lt;p&gt;附上一个&lt;a href="http://files.cnblogs.com/ejiyuan/tt.zip"&gt;tt代码生成器&lt;/a&gt;，用于从数据库中初始化实体&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/ejiyuan/aggbug/2373683.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ejiyuan/archive/2012/02/29/2373683.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2011/09/28/2194027.html</id><title type="text">不同.net版本实现单点登录</title><summary type="text">所谓单点登录（Single Sign On就是在多个应用系统中，用户只需要登录一次就可以访问所有相互信任的应用系统。其实对于程序员在技术上要实现就得就是多个不同域名间共享cookie的问题。 最近在为ERP添加一个部署在另一台机器上，链接到原有老系统中的子项目，调用原有老项目中的Login实现单点登录，尝试了N次屡试不成，最后确定问题，是，.net2.0与4.0中对cookie的加密/解密方法由此差异，于是经过研究，重写实现了一个可以在不同.net版本中实现单点登录的简单方法。1,共用登陆页代码实现：protectedvoidbtnLogin_Click(objectsender,Event.</summary><published>2011-09-28T03:54:00Z</published><updated>2011-09-28T03:54:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2011/09/28/2194027.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2011/09/28/2194027.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所谓单点登录（Single Sign On就是在多个应用系统中，用户只需要登录一次就可以访问所有相互信任的应用系统。其实对于程序员在技术上要实现就得就是多个不同域名间共享cookie的问题。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最近在为ERP添加一个部署在另一台机器上，链接到原有老系统中的子项目，调用原有老项目中的Login实现单点登录，尝试了N次屡试不成，最后确定问题，是，.net2.0与4.0中对cookie的加密/解密方法由此差异，于是经过研究，重写实现了一个可以在不同.net版本中实现单点登录的简单方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1,共用登陆页代码实现：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;btnLogin_Click(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;认证开票，跳转到原始请求页面&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Web.Security.FormsAuthentication.RedirectFromLoginPage(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ejiyuan&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;2,配置文件：&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000"&gt;访问权限控制&lt;/span&gt;&lt;span style="color: #008000"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;authorization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;deny&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;users&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="?"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;authorization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000"&gt;身份认证方式&lt;/span&gt;&lt;span style="color: #008000"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;authentication&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Forms"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;forms&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".ASPNET"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;protection&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="All"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;enableCrossAppRedirects&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;loginUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Login.aspx"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;timeout&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="2880"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;domain&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".local.com"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;authentication&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #008000"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000"&gt;验证算法&lt;/span&gt;&lt;span style="color: #008000"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;machineKey&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;validationKey&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;decryptionKey&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;validation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="SHA1"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;decryption&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="3DES"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;compilation&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;debug&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里：authentication/forms节点最重要的两个属性是name和protection. 所有实现单点登录的项目都要是相同的配置就这样，才可以在不同程序中同样的保护级别下读写Cookie&lt;br /&gt;当 protection属性设置为 "All",通过Hash值进行加密和验证数据都存放在Cookie中.默认的验证和加密使用的Key都存储在machine.config文件,我们可以在应用程序的Web.Config文件覆盖这些值.默认值如下:&lt;/p&gt;&lt;p&gt;&amp;lt;machineKeyvalidationKey="AutoGenerate,IsolateApps"decryptionKey=" AutoGenerate,IsolateApps"validation="SHA1" /&amp;gt;&lt;/p&gt;&lt;p&gt;IsolateApps表示为每个应用程序生成不同的Key.我们不能使用这个.为了能在多个应用程序中使用相同的Key来加密解密cookie,我们可以移除IsolateApps 选项或者更好的方法是在所有需要实现SSO的应用程序的Web.Config中设置一个具体的Key值: &lt;/p&gt;&lt;p&gt;&amp;lt;machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902" decryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC" validation="SHA1" decryption="3DES" /&amp;gt; &amp;lt;compilation debug="true"/&amp;gt;&lt;/p&gt;&lt;p&gt;如果你使用同样的存储方式,实现SSO只是改动一下Web.config而已，必须保证单点中的每个应用程序都有相同的配置，如果单点登录的应用程序是跨不同.net版本的，这里的加密/解密不要使用md5&lt;/p&gt;&lt;p&gt;&amp;lt;machineKey decryptionKey="8B6697227CBCA902B1A0925D00FAA00B353F2DF4359D2099" validation="MD5" validationKey="282487E295028E59B8F411ACB689CCD6F39DDD2146055A3EE480424315994760ADF21B580D8587DB675FA02F7916813044E25309CCCDB647174D5B3D0DD9141"/&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3,没有登录页的单点登录不需要代码 直接配置就可以了，配置如下&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;authorization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;deny&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;users&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="?"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;authorization&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;authentication&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;mode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Forms"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;forms&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".ASPNET"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;protection&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="All"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;enableCrossAppRedirects&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;loginUrl&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://Sso2.local.com/Login.aspx"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;timeout&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="2880"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;domain&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".local.com"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;authentication&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;4，登录模块从定向代码封装在httpModules中供其他系统直接调用，这里附上封装代码与引用方法：&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;SsoLoginRedirectModule&amp;nbsp;:&amp;nbsp;IHttpModule&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Init(HttpApplication&amp;nbsp;i_application)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;TODO:&amp;nbsp;&amp;nbsp;Add&amp;nbsp;UploadModule.Init&amp;nbsp;implementation&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i_application.EndRequest&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;EventHandler(i_application_EndRequest);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;i_application_EndRequest(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;((HttpContext.Current.Response.StatusCode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080"&gt;302&lt;/span&gt;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;HttpContext.Current.Response.RedirectLocation.Contains(FormsAuthentication.LoginUrl))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpContext.Current.Response.RedirectLocation&amp;nbsp;=&amp;nbsp;FormsAuthentication.LoginUrl&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;?ReturnUrl=&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;HttpUtility.UrlEncode(HttpContext.Current.Request.Url.OriginalString);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Dispose()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;throw&amp;nbsp;new&amp;nbsp;NotImplementedException();&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;引用：　&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;httpModules&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="SsoModule"&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="SsoModule.SsoLoginRedirectModule,&amp;nbsp;SsoModule"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;httpModules&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ejiyuan/aggbug/2194027.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ejiyuan/archive/2011/09/28/2194027.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/11/18/1879715.html</id><title type="text">基于WCF大型分布式系统的架构设计</title><summary type="text">在大型系统中应用中，一个架构设计较好的应用系统，其总体功能肯定是由很多个功能模块所组成的，而每一个功能模块所需要的数据对应到数据库中就是一个或多个表。而在架构设计中，各个功能模块相互之间的交互点越统一、越少，系统的耦合度就越低，系统各个模块的维护性及扩展性也就越好。在一个系统中特别是较为大型的系统中，如电子商务系统，可也按照功能，切分为，订单管理系统、商品管理系统、用户管理系统、供应商管理系统.....</summary><published>2010-11-18T02:02:00Z</published><updated>2010-11-18T02:02:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/11/18/1879715.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/11/18/1879715.html"/><content type="html">&lt;p&gt;在大型系统中应用中，一个架构设计较好的应用系统，其总体功能肯定是由很多个功能模块所组成的，而每一个功能模块所需要的数据对应到数据库中就是一个或多个表。而在架构设计中，各个功能模块相互之间的交互点越统一、越少，系统的耦合度就越低，系统各个模块的维护性及扩展性也就越好。&lt;br /&gt;在一个系统中特别是较为大型的系统中，如电子商务系统，可也按照功能，切分为，订单管理系统、商品管理系统、用户管理系统、供应商管理系统...等等，在这样的应用中系统切分了、功能独立了、耦合降低了、容易维护了、可是各个系统中的通讯怎么完成呢，如果，用户系统想查询某个用户的订单信息，要怎么做呢？是要直接引用，订单系统的DLL,还是把这些需要相互调用的功能放在一个叫Common的项目中供所有子系统调用呢，或者干脆直接在用户系统中跨库查询订单库，这些方法都不优良，这个时候该到微软的利器WCF亮相的时候了，先看下面架构图&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img style="width: 510px; height: 547px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/ejiyuan/Wcf.jpg" width="510" height="547" /&gt;&lt;/p&gt;&lt;p&gt;这个样设计的优点：&lt;br /&gt;1.层与层之间的服务器可以灵活组合，每层中的服务器，可水平扩展（集群），可纵向扩展（按系统/域/功能切分）&lt;br /&gt;2.所有中间件服务即可为本系统提供服务也可以为其他系统提供服务（甚至是第三方如：java的），提供系统间的无缝连接，系统之间的耦合不依赖于应用程序也不依赖于数据库，而依赖于服务接口。&lt;br /&gt;3.所有对数据库的操作都依赖于中间件，不允许对数据库直接操作,这样即达到了数据库的安全性，又能给应用程序服务器减压，因为实际的查询工作不在由应用程序服务器的数据访问层完成，而是分担给这个中间件服务器完成。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ejiyuan/aggbug/1879715.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ejiyuan/archive/2010/11/18/1879715.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/10/29/1796292.html</id><title type="text">数据库大型应用解决方案总结</title><summary type="text">随着互联网应用的广泛普及，海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用，每天百万级甚至上亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。一、负载均衡技术负载均衡集群是由一组相互独立的计算机系统构成，通过常规网络或专用网络进行连接，由路由器衔接在一起，各节点相互协作、共同负载、均衡压力，对客户端来说，整个群集可以视为一台具有超高性能的独立服...</summary><published>2010-10-29T02:39:00Z</published><updated>2010-10-29T02:39:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/10/29/1796292.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/10/29/1796292.html"/><content type="html">&lt;p&gt;&amp;nbsp;随着互联网应用的广泛普及，海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用，每天百万级甚至上亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、负载均衡技术&lt;br /&gt;&lt;/strong&gt;负载均衡集群是由一组相互独立的计算机系统构成，通过常规网络或专用网络进行连接，由路由器衔接在一起，各节点相互协作、共同负载、均衡压力，对客户端来说，整个群集可以视为一台具有超高性能的独立服务器。 &lt;/p&gt;&lt;p&gt;1、实现原理&lt;br /&gt;实现数据库的负载均衡技术，首先要有一个可以控制连接数据库的控制端。在这里，它截断了数据库和程序的直接连接，由所有的程序来访问这个中间层，然后再由中间层来访问数据库。这样，我们就可以具体控制访问某个数据库了，然后还可以根据数据库的当前负载采取有效的均衡策略，来调整每次连接到哪个数据库。&lt;br /&gt;2、实现多据库数据同步&lt;br /&gt;对于负载均衡，最重要的就是所有服务器的数据都是实时同步的。这是一个集群所必需的，因为，如果数不据实时、不同步，那么用户从一台服务器读出的数据，就有别于从另一台服务器读出的数据，这是不能允许的。所以必须实现数据库的数据同步。这样，在查询的时候就可以有多个资源，实现均衡。比较常用的方法是Moebius for SQL Server集群，Moebius for SQL Server集群采用将核心程序驻留在每个机器的数据库中的办法，这个核心程序称为Moebius for SQL Server 中间件，主要作用是监测数据库内数据的变化并将变化的数据同步到其他数据库中。数据同步完成后客户端才会得到响应，同步过程是并发完成的，所以同步到多个数据库和同步到一个数据库的时间基本相等；另外同步的过程是在事务的环境下完成的，保证了多份数据在任何时刻数据的一致性。正因为Moebius 中间件宿主在数据库中的创新，让中间件不但能知道数据的变化，而且知道引起数据变化的SQL语句，根据SQL语句的类型智能的采取不同的数据同步的策略以保证数据同步成本的最小化。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pczpg.com/a/uploadfile/2010/0205/20100205113200888.jpg"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/ejiyuan/20100205113200888.gif" width="500" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;数据条数很少，数据内容也不大，则直接同步数据&lt;br /&gt;数据条数很少，但是里面包含大数据类型，比如文本，二进制数据等，则先对数据进行压缩然后再同步，从而减少网络带宽的占用和传输所用的时间。&lt;br /&gt;数据条数很多，此时中间件会拿到造成数据变化的SQL语句， 然后对SQL语句进行解析，分析其执行计划和执行成本，并选择是同步数据还是同步SQL语句到其他的数据库中。此种情况应用在对表结构进行调整或者批量更改数据的时候非常有用。&lt;br /&gt;3、优缺点&lt;br /&gt;(1) 扩展性强：当系统要更高数据库处理速度时，只要简单地增加数据库服务器就 可以得到扩展。&lt;br /&gt;(2) 可维护性：当某节点发生故障时，系统会自动检测故障并转移故障节点的应用，保证数据库的持续工作。&lt;br /&gt;(3) 安全性：因为数据会同步的多台服务器上，可以实现数据集的冗余，通过多份数据来保证安全性。另外它成功地将数据库放到了内网之中，更好地保护了数据库的安全性。&lt;br /&gt;(4) 易用性：对应用来说完全透明，集群暴露出来的就是一个IP&lt;/p&gt;&lt;p&gt;(1) 不能够按照Web服务器的处理能力分配负载。&lt;br /&gt;(2) 负载均衡器(控制端)故障，会导致整个数据库系统瘫痪。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、数据库的读写分离&lt;br /&gt;&lt;/strong&gt;1，实现原理：读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器，这样能有效地减轻数据库压力，也能减轻io压力。主数据库提供写操作，从数据库提供读操作，其实在很多系统中，主要是读的操作。当主数据库进行写操作时，数据要同步到从的数据库，这样才能有效保证数据库完整性。&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/ejiyuan/6eb28920-0b0a-34e1-932d-78970198ec23.jpg" width="474" height="326" /&gt;&lt;/p&gt;&lt;p&gt;(ebay的读写比率是260:1,ebay的读写分离)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="width: 394px; height: 448px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/ejiyuan/sql_02.JPG" width="394" height="448" /&gt;&lt;/p&gt;&lt;p&gt;(微软数据库分发)&amp;nbsp;&lt;/p&gt;&lt;p&gt;2，实现方法：在MS Sql server中可以使用发布定义的方式实现数据库复制，实现读写分离，复制是将一组数据从一个数据源拷贝到多个数据源的技术，是将一份数据发布到多个存储站点上的有效方式。使用复制技术，用户可以将一份数据发布到多台服务器上。复制技术可以确保分布在不同地点的数据自动同步更新，从而保证数据的一致性。SQL SERVER复制技术类型有三种，分别是：快照复制、事务复制、合并复制。SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器，负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器，分发服务器包含有一个分发数据库，可接收数据的所有改变，并保存这些改变，再把这些改变分发给订阅服务器。&lt;/p&gt;&lt;p&gt;3，优缺点&lt;br /&gt;(1)数据的实时性差:数据不是实时同步到自读服务器上的，当数据写入主服务器后，要在下次同步后才能查询到。&lt;/p&gt;&lt;p&gt;(2)数据量大时同步效率差：单表数据量过大时插入和更新因索引,磁盘IO等问题，性能会变的很差。&lt;/p&gt;&lt;p&gt;(3)同时连接多个（至少两个）数据库：至少要连接到两个数据数据库，实际的读写操作是在程序代码中完成的，容易引起混乱&lt;/p&gt;&lt;p&gt;(4)读具有高性能高可靠性和可伸缩:只读服务器，因为没有写操作，会大大减轻磁盘IO等性能问题，大大提高效率；只读服务器可以采用负载均衡，主数据库发布到多个只读服务器上实现读操作的可伸缩性。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三、数据库拆分(分布式)&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过某种特定的条件，将存放在同一个数据库中的数据分散存放到多个数据库上，实现分布存储，通过路由规则路由访问特定的数据库，这样一来每次访问面对的就不是单台服务器了，而是N台服务器，这样就可以降低单台机器的负载压力。&lt;/p&gt;&lt;p&gt;垂直(纵向)拆分：是指按功能模块拆分，比如分为订单库、商品库、用户库...这种方式多个数据库之间的表结构不同。&lt;/p&gt;&lt;p&gt;水平(横向)拆分：将同一个表的数据进行分块保存到不同的数据库中，这些数据库中的表结构完全相同。&lt;/p&gt;&lt;p&gt;&lt;img style="width: 302px; height: 325px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/ejiyuan/分区1.jpg" width="302" height="325" /&gt;&lt;/p&gt;&lt;p&gt;（纵向拆分）&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/ejiyuan/分区2.jpg" width="121" height="384" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;（横向拆分）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1，实现原理：使用垂直拆分，主要要看应用类型是否合适这种拆分方式，如系统可以分为，订单系统，商品管理系统，用户管理系统业务系统比较明的，垂直拆分能很好的起到分散数据库压力的作用。业务模块不明晰，耦合（表关联）度比较高的系统不适合使用这种拆分方式。但是垂直拆分方式并不能彻底解决所有压力问题，例如 有一个5000w的订单表，操作起来订单库的压力仍然很大，如我们需要在这个表中增加（insert）一条新的数据，insert完毕后，数据库会针对这张表重新建立索引，5000w行数据建立索引的系统开销还是不容忽视的，反过来，假如我们将这个表分成100个table呢，从table_001一直到table_100，5000w行数据平均下来，每个子表里边就只有50万行数据，这时候我们向一张只有50w行数据的table中insert数据后建立索引的时间就会呈数量级的下降，极大了提高了DB的运行时效率，提高了DB的并发量，这种拆分就是横向拆分&lt;/p&gt;&lt;p&gt;2，实现方法：垂直拆分，拆分方式实现起来比较简单，根据表名访问不同的数据库就可以了。横向拆分的规则很多，这里总结前人的几点，&lt;/p&gt;&lt;p&gt;(1)顺序拆分：如可以按订单的日前按年份才分，2003年的放在db1中，2004年的db2,以此类推。当然也可以按主键标准拆分。&lt;/p&gt;&lt;p&gt;优点：可部分迁移&lt;/p&gt;&lt;p&gt;缺点：数据分布不均，可能2003年的订单有100W，2008年的有500W。&lt;/p&gt;&lt;p&gt;(2)hash取模分： 对user_id进行hash（或者如果user_id是数值型的话直接使用user_id的值也可），然后用一个特定的数字，比如应用中需要将一个数据库切分成4个数据库的话，我们就用4这个数字对user_id的hash值进行取模运算，也就是user_id%4,这样的话每次运算就有四种可能：结果为1的时候对应DB1；结果为2的时候对应DB2；结果为3的时候对应DB3；结果为0的时候对应DB4，这样一来就非常均匀的将数据分配到4个DB中。 &lt;br /&gt;优点：数据分布均匀 &lt;br /&gt;缺点：数据迁移的时候麻烦；不能按照机器性能分摊数据 。&lt;br /&gt;(3)在认证库中保存数据库配置 &lt;br /&gt;就是建立一个DB，这个DB单独保存user_id到DB的映射关系，每次访问数据库的时候都要先查询一次这个数据库，以得到具体的DB信息，然后才能进行我们需要的查询操作。 &lt;br /&gt;优点：灵活性强，一对一关系 &lt;br /&gt;缺点：每次查询之前都要多一次查询，会造成一定的性能损失。 &lt;br /&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/ejiyuan/aggbug/1796292.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ejiyuan/archive/2010/10/29/1796292.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/06/03/1750682.html</id><title type="text">从软件生命周期说项目经理工作职责与流程</title><summary type="text">一、需求分析 需求分析是对用户的业务活动进行分析，确定系统的目的、范围、定义和功能，明确在用户的业务环境中软件系统应该"做什么"。只有在确定了客户需求后，知道要“做什么”，才能够分析和寻求系统的解决方法，开展后续的工作，所以需求分析是软件工程中的一个关键过程。 这一步骤 要产生用户需求说明书，这个说明书既是给用户看的也是给开发人员看的，可以让用户更加确定自己的需求，让开发人...</summary><published>2010-06-03T05:10:00Z</published><updated>2010-06-03T05:10:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/06/03/1750682.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/06/03/1750682.html"/><content type="html">&lt;p&gt;一、需求分析&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 需求分析是对用户的业务活动进行分析，确定系统的目的、范围、定义和功能，明确在用户的业务环境中软件系统应该"做什么"。只有在确定了客户需求后，知道要&amp;#8220;做什么&amp;#8221;，才能够分析和寻求系统的解决方法，开展后续的工作，所以需求分析是软件工程中的一个关键过程。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这一步骤 要产生用户需求说明书，这个说明书既是给用户看的也是给开发人员看的，可以让用户更加确定自己的需求，让开发人员了解用户的需求。可以在需求说明说中包含业务流程图，来描述项目的业务流程。&lt;/p&gt;&lt;p&gt;二、软件设计&lt;br /&gt;软件设计的主要任务是把需求分析得到的结果转换为软件结构和数据结构，建立目标系统的逻辑模型，从而形成系统架构。明确软件系统应该"怎样做"&lt;br /&gt;概要设计&lt;br /&gt;&amp;nbsp; 1. 软件结构设计：将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。&lt;br /&gt;&amp;nbsp; 2. 数据结构设计：数据特征的描述、确定数据的结构特性、以及数据库的设计。&lt;br /&gt;详细设计&lt;br /&gt;　1．为每个模块确定采用的算法，选择某种适当的工具表达算法的过程，写出模块的详细过程性描述； &lt;br /&gt;&amp;nbsp; 2．确定每一模块使用的数据结构； &lt;br /&gt;&amp;nbsp; 3．确定模块接口的细节，包括对系统外部的接口和用户界面，对系统内部其它模块的接口，以及模块输入数据、输出数据及局部数据的全部细节。 &lt;br /&gt;&amp;nbsp; 4．要为每一个模块设计出一组测试用例，以便在编码阶段对模块代码（即程序）进行预定的测试。 &lt;br /&gt;这一步骤 需要产生系统概要设计说明书和系统详细设计说明书。&lt;/p&gt;&lt;p&gt;三、软件编码&lt;br /&gt;　&amp;nbsp; 软件编码就是将上一阶段的详细设计得到的处理过程的描述转换为基于某种计算机语言的程序，即源程序代码。&lt;br /&gt;&amp;nbsp; 1．制定项目开发计划文档，制订编码规范、量化任务，并合理分配给相应的人员。&lt;br /&gt;&amp;nbsp; 2．跟踪项目的进度，协调项目组成员之间的合作。&lt;br /&gt;&amp;nbsp; 3．监督产生项目进展各阶段的文档，保证文档的完整和规范。&lt;br /&gt;&amp;nbsp; 4．跟踪开发过程中的需求变更，与用户沟通确定变更需求，更改开发计划。&lt;/p&gt;&lt;p&gt;四、软件测试&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 软件测试就是利用测试工具按照测试方案和流程对产品进行功能和性能测试，需要跟踪故障，以确保开发的产品适合需求。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 项目经理需了解测试结果，根据测试的bug的严重程度来安排项目bug更改计划。&lt;/p&gt;&lt;p&gt;五、运行维护&lt;br /&gt;&amp;nbsp;&amp;nbsp; 软件维护主要是指根据需求变化或硬件环境的变化对应用程序进行部分或全部的修改，修改时应充分利用源程序。修改后要填写程序改登记表，并在程序变更通知书上写明新旧程序的不同之处。&lt;br /&gt;&amp;nbsp;&amp;nbsp; 项目经理需要配合部署人员做项目部署，了解项目部署环境，跟踪项目运行期间产生的bug安排相关人员对相应bug进行更改&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/ejiyuan/aggbug/1750682.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ejiyuan/archive/2010/06/03/1750682.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/06/01/1749368.html</id><title type="text">.NET 4中Entity Framework 新增查询与优化</title><summary type="text">外键支持（Foreign Keys）Entity Framework添加了对外键的支持。利用外键关联，您现在可以将外键属性包含在实体里，这样做可以简化诸如数据绑定、n-tier开发等关键方案的开发。您可以直接使用外键属性设置实体之间的关系：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeH...</summary><published>2010-06-01T08:59:00Z</published><updated>2010-06-01T08:59:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/06/01/1749368.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/06/01/1749368.html"/><content type="html">&lt;p&gt;&lt;strong&gt;外键支持（Foreign Keys）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Entity Framework添加了对外键的支持。利用外键关联，您现在可以将外键属性包含在实体里，这样做可以简化诸如数据绑定、n-tier开发等关键方案的开发。您可以直接使用外键属性设置实体之间的关系：&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('492985ef-a555-42aa-a72f-7e272e59e299')"&gt;&lt;div id="cnblogs_code_open_492985ef-a555-42aa-a72f-7e272e59e299"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(BlogEntities&amp;nbsp;ctx&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;BlogEntities())&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Post&amp;nbsp;myPost&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Post&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PostID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;102&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PostName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Post&amp;nbsp;Title&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CreatedDate&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;DateTime.Now,&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PostContent&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Post&amp;nbsp;Content&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BlogID&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;11&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.Posts.AddObject(myPost);&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.SaveChanges();&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在这个例子里，即使BlogID == 11的这个Blog对象从未被装载，我们也可以直接把新建的myPost对象与这个Blog对象之间的关系通过外键关联起来。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;延迟加载支持（Lazy Loading）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现在Entity Framework支持延迟加载。一个新的模型在VS2010中被创建的同时，提供延迟加载功能的实体也被生成出来。默认情况下这个功能是开启的，一个查询操作返回的实体对象并不会被马上加载，而是会在实际被使用的时候加载。举例来说，延迟加载意味着下面这个代码段里，每个Post对象会在实际被调用来打印PostName属性的时候被加载。 &lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('99b61c69-d785-4561-ad3c-6eb05f67f069')"&gt;&lt;div id="cnblogs_code_open_99b61c69-d785-4561-ad3c-6eb05f67f069"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(var&amp;nbsp;ctx&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;BlogEntities())&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(var&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ctx.Blogs)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(b.BlogName);&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;请注意我们并未主动装载当前blog的posts&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;EF会为我们延迟加载&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(var&amp;nbsp;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b.Posts)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(p.PostName);&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;加入SQL语句LIKE的生成支持&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在EF4中，加入对于WHERE语句的字符串参数使用数据库的通配符的支持。例如下面的LINQ查询语句会被翻译成一个使用WHERE子句和LIKE语句，并使用&amp;#8216;%&amp;#8217;通配符在所有的Blogs里搜索BlogName属性以&amp;#8216;Visual Studio&amp;#8217;开头的Blog。 &lt;strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;from&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ctx.Blogs&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;b.BlogName.StartsWith(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Visual&amp;nbsp;Studio&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;b;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;加入SQL语句IN的生成支持&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在EF4中，加入对于WHERE语句的参数多个值查询的支持。例如下面的LINQ查询语句会被翻译成一个使用WHERE子句和IN语句，并使用一个数组在所有的Blogs里搜索BlogName属性为"Visual"和"Studio"的所有数据。 &lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;from&amp;nbsp;b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ctx.Blogs&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;where&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;[]&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Visual&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Studio&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;}.Contains(&amp;nbsp;b.BlogName)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select&amp;nbsp;b;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/ejiyuan/aggbug/1749368.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/ejiyuan/archive/2010/06/01/1749368.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748429.html</id><title type="text">WCF身份验证之用户名密码认证</title><summary type="text">WCF支持多种认证技术，例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等，在跨Windows域分布的系统中，用户名密码认证是比较常用的，要实现用户名密码认证，就必须需要X509证书,用来加密用户名和密码。1. 创建数字证书 makecert -sr localmachine -ss My -n CN=ejiyuan -sky exchange -pe -r。2...</summary><published>2010-05-31T10:02:00Z</published><updated>2010-05-31T10:02:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748429.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748429.html"/><content type="text">WCF支持多种认证技术，例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等，在跨Windows域分布的系统中，用户名密码认证是比较常用的，要实现用户名密码认证，就必须需要X509证书,用来加密用户名和密码。1. 创建数字证书 makecert -sr localmachine -ss My -n CN=ejiyuan -sky exchange -pe -r。2...</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748363.html</id><title type="text">WCF身份验证之X509证书</title><summary type="text">X.509 数字证书是在 Internet 环境下，最方便的认证方式1. 创建数字证书 X509证书可以通过 证书颁发机构（如 VeriSign Inc）购买或通过MakeCert.exe 工具创建开发期间使用的临时证书 .制作一个证书。制作证书：makecert -sr localmachine -ss My -n CN=ejiyuan -sky exchange -pe -r。 参考：htt...</summary><published>2010-05-31T08:54:00Z</published><updated>2010-05-31T08:54:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748363.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748363.html"/><content type="text">X.509 数字证书是在 Internet 环境下，最方便的认证方式1. 创建数字证书 X509证书可以通过 证书颁发机构（如 VeriSign Inc）购买或通过MakeCert.exe 工具创建开发期间使用的临时证书 .制作一个证书。制作证书：makecert -sr localmachine -ss My -n CN=ejiyuan -sky exchange -pe -r。 参考：htt...</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748237.html</id><title type="text">说说WCF通信安全</title><summary type="text">WCF中每个标准绑定都提供用于控制传输安全性要求的参数。这些参数通常包括指定是使用消息级安全性还是使用传输级安全性的安全模式，还包括客户端凭据类型的选项。基于这些参数提供的可供选择的选项，构建一个具有适当安全性的信道堆栈。Transfer Security 主要包括三个方面： "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" ...</summary><published>2010-05-31T06:59:00Z</published><updated>2010-05-31T06:59:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748237.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/31/1748237.html"/><content type="text">WCF中每个标准绑定都提供用于控制传输安全性要求的参数。这些参数通常包括指定是使用消息级安全性还是使用传输级安全性的安全模式，还包括客户端凭据类型的选项。基于这些参数提供的可供选择的选项，构建一个具有适当安全性的信道堆栈。Transfer Security 主要包括三个方面： "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" ...</content></entry><entry><id>http://www.cnblogs.com/ejiyuan/archive/2010/05/29/1746793.html</id><title type="text">Microsoft Visual Studio 2010 简体中文旗舰版下载安装报告</title><summary type="text">听说MSDN放出了Microsoft Visual Studio 2010 简体中文旗舰版，怀着激动的心情下载安装。下面是下载地址如果有MSDN订阅账号的话可以去https://msdn.microsoft.com/zh-cn/subscriptions/securedownloads/default.aspx如果没有可以使用下面的地址下载，这里感谢前人的分享ed2k://|file|cn_vis...</summary><published>2010-05-29T00:48:00Z</published><updated>2010-05-29T00:48:00Z</updated><author><name>ejiyuan</name><uri>http://www.cnblogs.com/ejiyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/29/1746793.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/ejiyuan/archive/2010/05/29/1746793.html"/><content type="text">听说MSDN放出了Microsoft Visual Studio 2010 简体中文旗舰版，怀着激动的心情下载安装。下面是下载地址如果有MSDN订阅账号的话可以去https://msdn.microsoft.com/zh-cn/subscriptions/securedownloads/default.aspx如果没有可以使用下面的地址下载，这里感谢前人的分享ed2k://|file|cn_vis...</content></entry></feed>
