<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_dudu</title><subtitle type="text">为程序员打杂的站长</subtitle><id>http://feed.cnblogs.com/blog/u/0/rss</id><updated>2012-02-09T07:00:59Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/0/rss"/><entry><id>http://www.cnblogs.com/dudu/archive/2012/02/03/css_input_button_text_vertical_align.html</id><title type="text">浏览器兼容CSS代码：按钮文字垂直居中(input button text vertical align)</title><summary type="text">经过测试的浏览器：IE6, IE7, IE8, IE9, Firefox, Chrome, Safiri, Maxthon</summary><published>2012-02-03T10:14:00Z</published><updated>2012-02-03T10:14:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2012/02/03/css_input_button_text_vertical_align.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2012/02/03/css_input_button_text_vertical_align.html"/><content type="html">&lt;p&gt;经过测试的浏览器：IE6, IE7, IE8, IE9, Firefox, Chrome, Safiri, Maxthon&lt;/p&gt;&#xD;
&lt;p&gt;按钮的HTML代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="btn_comment_submit"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="button"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="comment_btn"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; value&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="提交评论"/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;CSS代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #800000;"&gt;input::-moz-focus-inner&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt; border&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;padding&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt; 0&lt;/span&gt;;}&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;针对Firefox&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;.comment_btn&lt;/span&gt;{&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;26px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;line-height&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;22px&lt;/span&gt;;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;针对IE&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;width&lt;/span&gt;:&lt;span style="color: #0000ff;"&gt;68px&lt;/span&gt;;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;显示效果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012020410303942.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2337468.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2012/02/03/css_input_button_text_vertical_align.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2012/01/06/2314386.html</id><title type="text">C#正则表达式操作中使用LINQ</title><summary type="text">针对在博客园闪存内容中提取Tag的需求，通过LINQ从正则表达式的捕获中提取出Tag。Tag要放在中括号之间并且出现在闪存内容的开头。</summary><published>2012-01-06T05:34:00Z</published><updated>2012-01-06T05:34:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2012/01/06/2314386.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2012/01/06/2314386.html"/><content type="html">&lt;p&gt;&lt;strong&gt;问题场景&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在博客园&lt;a href="http://home.cnblogs.com/ing/" target="_blank"&gt;闪存&lt;/a&gt;内容中提取Tag，Tag要放在中括号之间并且出现在闪存内容的开头。&lt;/p&gt;&#xD;
&lt;p&gt;比如：[程序员][代码]博客园 - 程序员的网上家园，代码改变世界&lt;/p&gt;&#xD;
&lt;p&gt;提取出来的Tag应该是：[程序员]、[代码]&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;正则表达式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Regex _regexTag = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;^(\[[^\]]+\])+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, RegexOptions.Compiled);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;通过LINQ从正则表达式的捕获中提取出Tag&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt; GetTags(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; ingContent)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; Capture c &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; _regexTag.Match(ingContent).Groups[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;].Captures   &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;select&lt;/span&gt; c.Value).ToList();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;注：即使没有捕获到，_regexTag.Match(ingContent).Groups[1].Captures也不会引发异常。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;LINQ使用感言&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;LINQ就像代码世界的小天使，给程序员带来了更多的轻松与快乐！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2314386.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2012/01/06/2314386.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2012/01/05/entity_framework_one_to_one_shared_primary_key.html</id><title type="text">Entity Framework - 理清关系 - 基于共享主键的单向一对一关系</title><summary type="text">在上篇文章中，我们理了一下基于外键关联的单向一对一关系。在这篇文章中，我们理一理“基于共享主键的单向一对一关系”，找出Entity Framework中正确的映射关系。经过努力，我们终于找到了最佳答案——.HasRequired(a =&gt; a.B).WithRequiredPrincipal();</summary><published>2012-01-05T05:43:00Z</published><updated>2012-01-05T05:43:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2012/01/05/entity_framework_one_to_one_shared_primary_key.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2012/01/05/entity_framework_one_to_one_shared_primary_key.html"/><content type="html">&lt;p&gt;在上篇文章中，我们理了一下&lt;a href="http://www.cnblogs.com/dudu/archive/2012/01/04/entity_framework_one_to_one_unidirectional.html" target="_blank"&gt;基于外键关联的单向一对一关系&lt;/a&gt;。在这篇文章中，我们理一理&amp;ldquo;基于共享主键的单向一对一关系&amp;rdquo;，找出Entity Framework中正确的映射关系。&lt;/p&gt;&#xD;
&lt;p&gt;一、明确需求，也就是Entity Framework正确映射之后要达到的效果&lt;/p&gt;&#xD;
&lt;p&gt;1）数据库结构要符合要求&amp;mdash;&amp;mdash;共享主键。所下图所示，数据库中表A与表B的主键都是AID。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010417312863.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2）实体关系要符合要求&amp;mdash;&amp;mdash;单向一对一关系。我们通过下面的UML类图来表达：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010509583019.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上图中只有A到B的关联箭头，这就是&amp;ldquo;单向&amp;rdquo;，这个箭头也表示A依赖B，在代码中的表现就是A有一个导航属性A.B。&lt;/p&gt;&#xD;
&lt;p&gt;上图中箭头两头的两个1就是&amp;ldquo;一对一&amp;rdquo;，存在一个A，必然存在一个对应的B；存在一个B，必然存在一个对应的A。&lt;/p&gt;&#xD;
&lt;p&gt;EDM中的实体关系要与UML类图中的关系一致。&lt;/p&gt;&#xD;
&lt;p&gt;实体A的定义：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; A&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; AID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Title { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; B B { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;实体B的定义：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; B&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; AID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Body { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;3）持久化操作要符合要求&lt;/p&gt;&#xD;
&lt;p&gt;只允许A与B一起进行持久化，测试代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; A();&lt;br /&gt;a.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;title test&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;a.B = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; B();&lt;br /&gt;a.B.Body = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;body test&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (EfUnitOfWork ef = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EfUnitOfWork())&lt;br /&gt;{&lt;br /&gt;    ef.Set&amp;lt;A&amp;gt;().Add(a);&lt;br /&gt;    ef.SaveChanges();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;不允许A与B各自单独的持久化，测试代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&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;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; A();&lt;br /&gt;a.Title = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;title a&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (EfUnitOfWork ef = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EfUnitOfWork())&lt;br /&gt;{&lt;br /&gt;    ef.Set&amp;lt;A&amp;gt;().Add(a);&lt;br /&gt;    ef.SaveChanges();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; b = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; B();&lt;br /&gt;b.Body = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;body b&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (EfUnitOfWork ef = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EfUnitOfWork())&lt;br /&gt;{&lt;br /&gt;    ef.Set&amp;lt;B&amp;gt;().Add(b);&lt;br /&gt;    ef.SaveChanges();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;4）生成的SQL查询语句要符合要求&lt;/p&gt;&#xD;
&lt;p&gt;比如这样的查询：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (EfUnitOfWork ef = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EfUnitOfWork())&lt;br /&gt;{&lt;br /&gt;    ef.Set&amp;lt;A&amp;gt;()&lt;br /&gt;        .Include(a =&amp;gt; a.B)&lt;br /&gt;        .Where(a =&amp;gt; a.AID == &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;        .ToList();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;生成的SQL查询语句应该是：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Title&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Title&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Body&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Body&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;A&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;INNER&lt;/span&gt; &lt;span style="color: #808080;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;B&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;B_AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; &lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;二、用最笨的方法找出答案&lt;/p&gt;&#xD;
&lt;p&gt;这个最笨的方法是，对四种映射关系逐一进行测试，看哪个与我们想要的效果最一致。&lt;/p&gt;&#xD;
&lt;p&gt;下面我们分别来看看在不同的映射关系配置下Entity Framework的行为。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1）.HasRequired(a =&amp;gt; a.B).WithMany();&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;FluentAPI:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br /&gt;{&lt;br /&gt;    modelBuilder.Entity&amp;lt;B&amp;gt;().HasKey(b =&amp;gt; b.AID);&lt;br /&gt;    modelBuilder.Entity&amp;lt;A&amp;gt;().HasRequired(a =&amp;gt; a.B).WithMany();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;a) EF生成的数据库结构：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010421595310.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010510522731.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;表A多了一个字段B_AID，并通过B_AID关联至表B的主键AID。数据库结构不一致，不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;b) EF生成的EDM图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010418153039.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;EDM与UML中的关系定义不一致，这里是一对多关系，我要的是一对一关系，不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;c) 不允许实体A的单独持久化，但允许实体B的单独持久化，不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;d) 生成的SQL查询语句符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;【小结】数据库结构不符合要求，实体关系不符合要求，持久化不符合要求，生成的SQL查询语句符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2）.HasRequired(a =&amp;gt; a.B).WithOptional();&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;FluentAPI:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br /&gt;{&lt;br /&gt;    modelBuilder.Entity&amp;lt;B&amp;gt;().HasKey(b =&amp;gt; b.AID);&lt;br /&gt;    modelBuilder.Entity&amp;lt;A&amp;gt;().HasRequired(a =&amp;gt; a.B).WithOptional();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;a)&amp;nbsp;EF生成的数据库结构：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010422132856.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010510575150.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;数据库结构符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;b) EF生成的EDM图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010418210397.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关联的一端是0..1，也就是允许&amp;ldquo;存在一个B，不存在一个A&amp;rdquo;的情况，实体关系不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;c)&amp;nbsp;不允许实体A的单独持久化，但允许实体B的单独持久化，不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;d)&amp;nbsp;生成的SQL查询语句符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;【小结】数据库结构符合要求，实体关系不符合要求，持久化不符合要求，SQL查询语句符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3）.HasRequired(a =&amp;gt; a.B).WithRequiredDependent();&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;FluentAPI:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br /&gt;{&lt;br /&gt;    modelBuilder.Entity&amp;lt;B&amp;gt;().HasKey(b =&amp;gt; b.AID);&lt;br /&gt;    modelBuilder.Entity&amp;lt;A&amp;gt;().HasRequired(a =&amp;gt; a.B).WithRequiredDependent();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;a) 生成的数据库结构与.WithOptional();一样，符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;b) EF生成的EDM图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010418253735.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实体关系是&amp;ldquo;单向一对一&amp;rdquo;关系，与UML类图一致。但类的摆放位置不一致，在EDM中，B在A的前面，也就是B是Principal，我们希望A是Pricipal，有点不一致。&lt;/p&gt;&#xD;
&lt;p&gt;c)&amp;nbsp;不允许实体A的单独持久化，但允许实体B的单独持久化，不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;d)&amp;nbsp;生成的SQL查询语句符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;【小结】数据库结构符合要求，实体关系有点不符合要求（Pricipal不一致），持久化不符合要求，SQL查询语句符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4）.HasRequired(a =&amp;gt; a.B).WithRequiredPrincipal();&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;FluentAPI:&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br /&gt;{&lt;br /&gt;    modelBuilder.Entity&amp;lt;B&amp;gt;().HasKey(b =&amp;gt; b.AID);&lt;br /&gt;    modelBuilder.Entity&amp;lt;A&amp;gt;().HasRequired(a =&amp;gt; a.B).WithRequiredPrincipal();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;a) 生成的数据库结构与.WithOptional();一样，符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;b) EF生成的EDM图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010418294732.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实体关系是&amp;ldquo;单向一对一&amp;rdquo;关系，与UML类图一致，A是Pricipal，符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;c) 允许实体A的单独持久化，不允许实体B的单独持久化，不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;d) 生成的SQL查询语句：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Title&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Title&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent3&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent3&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Body&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Body&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;   &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;A&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #808080;"&gt;LEFT&lt;/span&gt; &lt;span style="color: #808080;"&gt;OUTER&lt;/span&gt; &lt;span style="color: #808080;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;B&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #808080;"&gt;LEFT&lt;/span&gt; &lt;span style="color: #808080;"&gt;OUTER&lt;/span&gt; &lt;span style="color: #808080;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;B&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent3&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent3&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; &lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;我们想要的是INNER JOIN，这里却是两个LEFT OUTER JOIN，不符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;等等。。。我们改一下查询的LINQ语句试试，改为：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (EfUnitOfWork ef = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; EfUnitOfWork())&lt;br /&gt;{&lt;br /&gt;    ef.Set&amp;lt;A&amp;gt;()&lt;br /&gt;        .Include(a =&amp;gt; a.B)&lt;br /&gt;        .Where(a =&amp;gt; a.B.AID == &lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;原来是a =&amp;gt; a.AID == 1&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        .ToList();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;改过之后，生成的SQL查询语句符合要求：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Title&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Title&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Body&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Body&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;A&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;INNER&lt;/span&gt; &lt;span style="color: #808080;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;B&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; &lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;AID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;【小结】数据库结构符合要求，实体关系符合要求，持久化不符合要求，SQL查询语句符合要求。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;三、总结与分析&lt;/p&gt;&#xD;
&lt;table border="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&#xD;
&lt;td&gt;数据库结构&lt;/td&gt;&#xD;
&lt;td&gt;实体关系&lt;/td&gt;&#xD;
&lt;td&gt;持久化&lt;/td&gt;&#xD;
&lt;td&gt;SQL查询语句&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;WithMany()&lt;/td&gt;&#xD;
&lt;td&gt;不符合&lt;/td&gt;&#xD;
&lt;td&gt;不符合&lt;/td&gt;&#xD;
&lt;td&gt;不符合&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;WithOptional()&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;不符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;不符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;WithRequiredDependent()&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;不符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;不符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;WithRequiredPrincipal()&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;不符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span&gt;符合&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;br /&gt;从上面的表中可以出，成绩最好的是WithRequiredPrincipal()，但它有一个地方不符合要求， 就是允许实体A的单独持久化。&lt;/p&gt;&#xD;
&lt;p&gt;为什么实体B不能单独持久化？看数据库的外键关系就知道答案（A_B外键约束的功劳）：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010512551471.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;那我们只要解决&amp;ldquo;不允许实体A的单独持久化&amp;rdquo;的问题，就能完成&amp;ldquo;基于共享主键的单向一对一关系&amp;rdquo;的完美映射。&lt;/p&gt;&#xD;
&lt;p&gt;既然数据库中不好下手，那就从实体类下手吧。给实体A的导航属性A.B加一个[Required]属性，在实体验证时就要求A.B必须有一个对应的实体B的实例。修改后的实体A的代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; A&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; AID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Title { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    [Required]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; B B { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;经过努力，我们终于找到了最佳答案&amp;mdash;&amp;mdash;&lt;/p&gt;&#xD;
&lt;p&gt;对于&amp;ldquo;基于共享主键的单向一对一&amp;rdquo;关系，Entity Framework中正确的映射关系定义是：&lt;/p&gt;&#xD;
&lt;p&gt;modelBuilder.Entity&amp;lt;A&amp;gt;().HasRequired(a =&amp;gt; a.B).WithRequiredPrincipal();&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2312321.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2012/01/05/entity_framework_one_to_one_shared_primary_key.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2012/01/04/entity_framework_one_to_one_unidirectional.html</id><title type="text">Entity Framework - 理清关系 - 基于外键关联的单向一对一关系</title><summary type="text">理清“基于外键关联的单向一对一关系”，关键在于对.HasRequired(A =&gt; A.B).WithMany()的理解。我的理解是：.HasRequired(A =&gt; A.B) 表示：1）实体A有一个导航属性A.B；2）在数据库中表A与表B存在一对一关联。.WithMany() 表示：1） 实体B与实体A可以没有关系，也可以是一对多关系；2）在数据库中表A与表B存在外键关联。</summary><published>2012-01-04T07:03:00Z</published><updated>2012-01-04T07:03:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2012/01/04/entity_framework_one_to_one_unidirectional.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2012/01/04/entity_framework_one_to_one_unidirectional.html"/><content type="html">&lt;p&gt;注：本文针对的是&amp;nbsp;Entity Framework&amp;nbsp;Code First 场景。&lt;/p&gt;&#xD;
&lt;p&gt;之前写过三篇文章试图理清Entity Framework中的一对一关系（&lt;a href="http://www.cnblogs.com/dudu/archive/2011/07/07/entity_framework_one_to_one.html" target="_blank"&gt;单相思（单向一对一）&lt;/a&gt;, &lt;a href="http://www.cnblogs.com/dudu/archive/2011/07/08/entity_framework_one_to_one_two_way.html" target="_blank"&gt;两情相悦（双向一对一）&lt;/a&gt;, &lt;a href="http://www.cnblogs.com/dudu/archive/2011/07/08/entity_framework_one_to_one_two_way_best.html" target="_blank"&gt;两情相悦-续&lt;/a&gt;），但当时理得不够清，新的一年重新理一理。&lt;/p&gt;&#xD;
&lt;p&gt;当时&amp;ldquo;一对一&amp;rdquo;的实体关系，对应的数据库关系是外键关联（实际上是一种&amp;ldquo;一对多&amp;rdquo;关系，所以映射时用了WithMany）。而数据库中的&amp;ldquo;一对一&amp;rdquo;关系是共享主键（这是我个人的理解，不妥之处，欢迎指出），下篇文章将要理的就是这个关系。&lt;/p&gt;&#xD;
&lt;p&gt;由于双向&amp;ldquo;一对一&amp;rdquo;关系很少用到，而且不推荐使用，为了更清楚地理解，我们这里只谈单向一对一关系，也就是&amp;ldquo;基于外键关联的单向一对一关系(One-to-one Unidirectional relationships)&amp;rdquo;，对应的之前的文章是&lt;a href="http://www.cnblogs.com/dudu/archive/2011/07/07/entity_framework_one_to_one.html" target="_blank"&gt;单相思（单向一对一）&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;1. 类图&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010410325064.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2. 类的定义&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; BlogSite&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; BlogID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; BlogApp { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; IsActive { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Guid UserID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }    &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt; BlogUser BlogUser { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; BlogUser&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Guid UserID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Author { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; BlogID { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;3. 数据库结构&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010410425530.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4. Enitity Framework映射关系定义&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br /&gt;{&lt;br /&gt;    modelBuilder.Entity&amp;lt;BlogSite&amp;gt;()&lt;br /&gt;        .HasRequired(b =&amp;gt; b.BlogUser)&lt;br /&gt;        .WithMany();&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;怎么理解这里的HasRequired与WithMany呢？&lt;/p&gt;&#xD;
&lt;p&gt;我的理解是：HasRequired是针对BlogSite与BlogUser的关系，WithMany是针对BlogUser与BlogSite的关系。.HasRequired(b =&amp;gt; b.BlogUser).WithMany()表示BlogSite与BlogUser存在Required关联关系（One-To-One, 每一个BlogSite都有一个对应的BlogUser），而这个关联对BlogUser来说是One-To-Many（一个BlogUser可以有多个BlogSite）。&lt;/p&gt;&#xD;
&lt;p&gt;你也许会疑惑？明明是单向一对一的实体关系，这里怎么弄出个一对多的关系？&lt;/p&gt;&#xD;
&lt;p&gt;如果有这样的疑惑，属正常现象，我从去年7月份写那篇文章开始疑惑，一直疑惑到现在，写篇文章时才有点搞明白。&lt;/p&gt;&#xD;
&lt;p&gt;注意，&amp;ldquo;单向一对一&amp;rdquo;是什么？是实体关系；Entity Framework是什么？是O/RM，是用来映射实体关系与数据库关系；还少了什么？数据库关系。&lt;/p&gt;&#xD;
&lt;p&gt;从上面的图中的数据库结构可以看出，BlogSite与BlogUser之间是外键关联关系，下面的图可以更清楚地看出这一点。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010411404119.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个外键关联表示的就是BlogUser与BlogSite之间是一对多的数据库关系。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;总结一下：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实体关系 &amp;mdash;&amp;mdash; BlogSite与BlogUser之间的单向一对一&lt;/p&gt;&#xD;
&lt;p&gt;数据库关系 &amp;mdash;&amp;mdash; BlogUser与BlogSite之间的一对多&lt;/p&gt;&#xD;
&lt;p&gt;是不是这样呢？Entity Framework是不是也是这样认为的呢？我们来验证一下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;怎么知道Entity Framework的想法呢？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;通过EDM。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;可这里是Code First？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;不管什么First，都有EDM，因为这是Entity Framework的地图，没有它，Entity Framework就会晕头转向。Code First的EDM是在EF运行时生成的，不是没有地图，只是在Entity Framework的心中，我们看不到而已。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;怎么让Entity Framework说出心里话呢？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;从Morteza Manavi大师那学到&lt;a href="http://weblogs.asp.net/manavi/archive/2011/05/17/associations-in-ef-4-1-code-first-part-6-many-valued-associations.aspx" target="_blank"&gt;一招&lt;/a&gt;，代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; context = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Context())&lt;br /&gt;{&lt;br /&gt;    XmlWriterSettings settings = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; XmlWriterSettings();&lt;br /&gt;    settings.Indent = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (XmlWriter writer = XmlWriter.Create(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Model.edmx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, settings))&lt;br /&gt;    {&lt;br /&gt;        EdmxWriter.WriteEdmx(context, writer);&lt;br /&gt;    }                            &lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;通过上面的代码，你就可以拿到EF心中的地图 &amp;mdash;&amp;mdash; edmx文件。请看地图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1/2012010412140353.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;果然，EF心中的地图就是BlogUser与BlogSite的一对多关系。地图的作用是什么？是让EF通过地图在数据库找到对应的数据。地图是如何产生的？是我们通过FluentAPI告诉Entity Framework：.HasRequired(b =&amp;gt; b.BlogUser).WithMany()。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;我们再来剖析一下.HasRequired(b =&amp;gt; b.BlogUser).WithMany()。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之前，我一直被困扰，是因为总是把这里的定义当作实体的关系的定义。错！这里虽然用的是实体进行定义，但定义的是实体与数据库中的数据之间的映射关系（这本来就是常识，竟然被忽略了），更多的是告诉EF这些实体在数据库中的数据关系。EF最终是根据这个定义生成相应的SQL。&lt;/p&gt;&#xD;
&lt;p&gt;那我们从生成查询SQL的角度来理解一下：&lt;/p&gt;&#xD;
&lt;p&gt;.HasRequired(b =&amp;gt; b.BlogUser)告诉EF，这是一个INNER JOIN查询（BlogSite INNER JOIN BlogUser）；但INNER JOIN还需要条件，WithMany()告诉EF这是一个外键关联，EF据此进行推断，从BlogUser中找到主键UserID，并检查BlogSite中是否存在名为UserID的属性，如果存在，就以此为外键进行查询。而我们的BlogSite中有UserID，于是生成下面的SQL：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;SELECT&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;BlogID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;BlogID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;BlogApp&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;BlogApp&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;IsActive&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;IsActive&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;UserID1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;, &lt;br /&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Author&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Author&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;  &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;BlogSite&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;INNER&lt;/span&gt; &lt;span style="color: #808080;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;BlogUser&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AS&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent2&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;UserID&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;WHERE&lt;/span&gt; &lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt; &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;IsActive&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;理清&amp;ldquo;基于外键关联的单向一对一关系&amp;rdquo;，关键在于对modelBuilder.Entity&amp;lt;A&amp;gt;().HasRequired(A =&amp;gt; A.B).WithMany()的理解。&lt;/p&gt;&#xD;
&lt;p&gt;我再来理解一次：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;.HasRequired(A =&amp;gt; A.B)&lt;/strong&gt; 表示：1）实体A与实体B是一对一关系，实体A有一个导航属性A.B；2）在数据库中表A与表B存在一对一关联（INNER JOIN）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;.WithMany()&lt;/strong&gt; 表示：1） 实体B与实体A可以没有关系，也可以是一对多关系；2）在数据库中表A与表B存在外键关联。&lt;/p&gt;&#xD;
&lt;p&gt;上面全是我的个人理解，真正理清Entity Framework中的关系需要大家的力量，我只是抛个砖。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;除了&amp;ldquo;基于外键关联的单向一对一关系&amp;rdquo;，还有&amp;ldquo;基于共享主键的单向一对一关系&amp;rdquo;，这也是我们开发中经常碰到的一种关系，比如博客文章(BlogPost)与文章内容(PostBody)，新闻(NewsItem)与新闻内容(NewsBody)。下一篇文章将会理理这个关系。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2311112.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2012/01/04/entity_framework_one_to_one_unidirectional.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2011/12/31/wcfclient.html</id><title type="text">享受无止境 - 改进版WCF Client</title><summary type="text">今天下午，借助.NET世界中一个强大的武器完成了这个小小的心愿，它就是表达式树。享受无止境，但真正让人成长与快乐的不是得到那个享受，而是这个追求享受的过程。现实世界如此，代码世界也是如此。祝大家2012年在代码世界享受更多快乐！</summary><published>2011-12-31T08:46:00Z</published><updated>2011-12-31T08:46:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2011/12/31/wcfclient.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2011/12/31/wcfclient.html"/><content type="html">&lt;p&gt;在之前的文章&amp;ldquo;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/11/02/wcf_client_no_using_call.html" target="_blank"&gt;让WCF客户端的&amp;ldquo;调用&amp;rdquo;成为一种&amp;lsquo;享受&amp;rsquo;&lt;/a&gt;&amp;rdquo;中，分别用Func与Action实现了WCF客户端调用接口。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Func实现的调用方式：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;WcfClient.UseService((IUserService userService) =&amp;gt; (userService.GetUser(userId)));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;缺点：&lt;/p&gt;&#xD;
&lt;p&gt;1. 需要用匿名方法传递参数，写起来比较麻烦。&lt;/p&gt;&#xD;
&lt;p&gt;2. 不支持无返回值的ServiceContract。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Action实现的调用方式：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;List&amp;lt;ZzkDocument&amp;gt; docs = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;WcfClient.UseService&amp;lt;IZzkDocumentService&amp;gt;(&lt;br /&gt;    s =&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        docs = s.GetZzkDocuments(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;30&lt;/span&gt;).ToList(); &lt;br /&gt;    });&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;缺点：&lt;/p&gt;&#xD;
&lt;p&gt;虽然支持了无返回值的ServiceContract，但需要在Lambda表达式中获取返回值。这样还造成了无法使用类型判断，也就是不能使用var docs。&lt;/p&gt;&#xD;
&lt;p&gt;用Action&amp;ldquo;享受&amp;rdquo;了很多次的过程中，总是有那么一点点&amp;ldquo;不爽&amp;rdquo;萦绕在心头，挥之不去。。。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2011即将过去，2012即将到来，在这辞旧换新之际，也把那一点点&amp;ldquo;不爽&amp;rdquo;辞去吧。&lt;/p&gt;&#xD;
&lt;p&gt;今天下午，借助.NET世界中一个强大的武器完成了这个小小的心愿，它就是表达式树 &amp;mdash;&amp;mdash;&amp;nbsp;Expression&amp;lt;Func&amp;lt;TService, TReturn&amp;gt;&amp;gt; operation&lt;/p&gt;&#xD;
&lt;p&gt;先一睹调用改进版WCF Client的风采：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; client = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; WcfClient&amp;lt;IZzkDocumentService&amp;gt;();&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; docs = client.UseService(s =&amp;gt; s.GetZzkDocuments(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;10&lt;/span&gt;));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;然后看看WcfClient的实现代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; WcfClient&amp;lt;TService&amp;gt; &lt;span style="color: #0000ff;"&gt;where&lt;/span&gt; TService : &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; TReturn UseService&amp;lt;TReturn&amp;gt;(&lt;strong&gt;Expression&amp;lt;Func&amp;lt;TService, TReturn&amp;gt;&amp;gt; operation&lt;/strong&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; channelFactory = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ChannelFactory&amp;lt;TService&amp;gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;*&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        TService channel = channelFactory.CreateChannel();&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; client = (IClientChannel)channel;&lt;br /&gt;        client.Open();&lt;br /&gt;        &lt;strong&gt;TReturn result = operation.Compile().Invoke(channel);&lt;/strong&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (client.State != CommunicationState.Faulted)&lt;br /&gt;            {&lt;br /&gt;                client.Close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            client.Abort();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; result;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;对于Expression&amp;lt;Func&amp;lt;TService, TReturn&amp;gt;&amp;gt; operation，我的理解是：请你告诉我，如果给你一段代码（TService），你如何给我一个改变了的世界（TReturn）。我不关心给你的是什么代码，也不关心改变后的世界是什么样子，我只关心你如何改变世界。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;享受无止境，但真正让人成长与快乐的不是得到那个享受，而是这个追求享受的过程。现实世界如此，代码世界也是如此。&lt;/p&gt;&#xD;
&lt;p&gt;祝大家2012年在代码世界享受更多快乐！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考文章：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://marcgravell.blogspot.com/2009/03/explaining-expression.html" target="_blank"&gt;Explaining Expression&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2308852.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/12/31/wcfclient.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2011/12/30/2306910.html</id><title type="text">2011年的那个“一”</title><summary type="text">一本书：《.NET软件架构之美 Microsoft .NET: Architecting Applications for the Enterprise》（链接）一首歌：孙燕姿《追》（链接）一部电影：《源代码 Sourec Code》（链接）一个问题：ISAPI_Rewrite引起的IIS应用程序池崩溃(fatal communication error)（链接）一个桌面：《欧洲城堡》（链接）一行代码：string.Join(&amp;quot;&amp;#39;,&amp;#39;&amp;quot;, userIDs); //List&amp;lt;Guid&amp;gt; userIDs一句话：“你在找的根本不是「成功」，你在找的是「</summary><published>2011-12-30T00:28:00Z</published><updated>2011-12-30T00:28:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2011/12/30/2306910.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2011/12/30/2306910.html"/><content type="html">&lt;p&gt;一本书：《.NET软件架构之美 &lt;span&gt;Microsoft .NET: Architecting Applications for the Enterprise&lt;/span&gt;》（&lt;a href="http://www.cnblogs.com/dudu/articles/2221521.html" target="_blank"&gt;链接&lt;/a&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;一首歌：孙燕姿《追》（&lt;a href="http://v.youku.com/v_show/id_XMjgyNjg4Njcy.html" target="_blank"&gt;链接&lt;/a&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;一部电影：《源代码 Sourec Code》（&lt;a href="http://v.youku.com/v_show/id_XMzA4Mjk1MTQ4.html?firsttime=4045" target="_blank"&gt;链接&lt;/a&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;一个问题：ISAPI_Rewrite引起的IIS应用程序池崩溃(fatal communication error)（&lt;a href="http://www.cnblogs.com/dudu/archive/2011/08/09/fatal_communication_error.html" target="_blank"&gt;链接&lt;/a&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;一个桌面：《欧洲城堡》（&lt;a href="http://news.cnblogs.com/n/105477/" target="_blank"&gt;链接&lt;/a&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;一行代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Join(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;','&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, userIDs); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;List&amp;lt;Guid&amp;gt; userIDs&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;一句话：&amp;ldquo;你在找的根本不是「成功」，你在找的是「进步」。&amp;rdquo; （&lt;a href="http://news.cnblogs.com/n/124665/" target="_blank"&gt;链接&lt;/a&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;...&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2306910.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/12/30/2306910.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html</id><title type="text">让Entity Framework不再私闯sys.databases</title><summary type="text">这里的“私闯sys.databases”是指Entity Framework默认发起的查询：SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名'。经过今天下午的努力，终于找到了解决方法：Database.SetInitializer(null);</summary><published>2011-12-27T08:52:00Z</published><updated>2011-12-27T08:52:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html"/><content type="html">&lt;p&gt;这里的&amp;ldquo;私闯sys.databases&amp;rdquo;是指Entity Framework默认发起的查询：SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名'&lt;/p&gt;&#xD;
&lt;p&gt;注：本文针对的是Entity Framework&amp;nbsp;Code First场景，Entity Framework的版本是4.1与4.2。&lt;/p&gt;&#xD;
&lt;p&gt;3月份的时候在&lt;a href="http://www.cnblogs.com/dudu/archive/2011/03/31/2001300.html" target="_blank"&gt;揭开Entity Framework LINQ查询的一点面纱&lt;/a&gt;一文中发现了Entity Framework的两个幕后交易。&lt;/p&gt;&#xD;
&lt;p&gt;第一个交易（私闯sys.databases）：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff;"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;Count&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #808080;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&lt;/span&gt;&lt;span style="color: #000000;"&gt; sys.databases &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;WHERE&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;N&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;CNBlogsData&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;第二个交易（私自打探数据库的信息）：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff;"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;TOP&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Id&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Id&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ModelHash&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ModelHash&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;EdmMetadata&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ORDER&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Extent1&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Id&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DESC&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;当时通过&lt;span&gt;modelBuilder.Conventions.Remove&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;IncludeMetadataConvention&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;();阻止了第二个交易，但未能找到方法阻止第一个交易。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;记得当时用的是Entity Framework 4.0，后来微软发布了EF4.1和EF4.2。那我们来看看Entity Framework有没有改邪归正。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;结果发现，只改了一半，第二个交易&amp;ldquo;浪子回头&amp;rdquo;，而第一个交易&amp;ldquo;贼心不改&amp;rdquo;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;代码世界是完美世界，决不允许这样的行为，一定要将之绳之以法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;经过今天下午的努力，终于找到了这根&amp;ldquo;绳子&amp;rdquo;：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;Database.SetInitializer&amp;lt;DbContextTypeName&amp;gt;(null);&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;示例代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; EfUnitOfWork : DbContext, IUnitOfWork&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; EfUnitOfWork()&lt;br /&gt;    {&lt;br /&gt;        Database.SetInitializer&amp;lt;EfUnitOfWork&amp;gt;(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&lt;br /&gt;    }       &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)&lt;br /&gt;    {       &lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;可以看出，Entity Framework&amp;ldquo;私闯sys.databases&amp;rdquo;的目的是为了在根据实体生成数据库时，检查是否存在同名的数据库。&lt;/p&gt;&#xD;
&lt;p&gt;而我们的应用场景根本不需要Entity Framework生成数据库，所以将之绳之以法是&amp;ldquo;名正言顺&amp;rdquo;。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2303701.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2011/12/18/string_array_to_int_array.html</id><title type="text">C# string Array to int Array</title><summary type="text">在C#中，目前发现的将字符串型数据string[]转换为整型数据int[]的最简单方法 —— 使用的是Array的静态方法Array.ConvertAll。</summary><published>2011-12-18T09:41:00Z</published><updated>2011-12-18T09:41:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2011/12/18/string_array_to_int_array.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2011/12/18/string_array_to_int_array.html"/><content type="html">&lt;p&gt;在C#中，目前发现的将&amp;ldquo;字符串型数组string[]&amp;rdquo;转换为&amp;ldquo;整型数组int[]&amp;rdquo;的最简单方法：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] ids = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[&lt;span style="color: #800080;"&gt;5&lt;/span&gt;] { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;5&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;6&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;7&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;8&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;9&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; };&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;[] ids2 = Array.ConvertAll(ids, id =&amp;gt; Convert.ToInt32(id));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;使用的是Array的静态方法&lt;a href="http://msdn.microsoft.com/en-us/library/exc45z53.aspx" target="_blank"&gt;Array.ConvertAll&amp;lt;TInput, TOutput&amp;gt;&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2291879.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/12/18/string_array_to_int_array.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2011/12/16/2284828.html</id><title type="text">AutoMapper使用笔记</title><summary type="text">AutoMapper是一个.NET的对象映射工具。主要用途是领域对象与DTO之间的转换、数据库查询结果映射至实体对象。</summary><published>2011-12-16T06:34:00Z</published><updated>2011-12-16T06:34:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2011/12/16/2284828.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2011/12/16/2284828.html"/><content type="html">&lt;p&gt;AutoMapper是一个.NET的对象映射工具。&lt;/p&gt;&#xD;
&lt;p&gt;项目地址：&lt;a href="https://github.com/AutoMapper/AutoMapper"&gt;https://github.com/AutoMapper/AutoMapper&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;帮助文档：&lt;a href="https://github.com/AutoMapper/AutoMapper/wiki"&gt;https://github.com/AutoMapper/AutoMapper/wiki&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;主要用途&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;领域对象与DTO之间的转换、数据库查询结果映射至实体对象。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;使用笔记&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #008000;"&gt;场景1：&lt;/span&gt;源类型BlogEntry，目标类型BlogPostDto，指定属性进行映射（BlogEntry.ID对应于BlogPostDto.PostId）。&lt;/p&gt;&#xD;
&lt;p&gt;代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;AutoMapper.Mapper.CreateMap&amp;lt;BlogEntry, BlogPostDto&amp;gt;()&lt;br /&gt;                .ForMember(dto =&amp;gt; dto.PostId, opt =&amp;gt; opt.MapFrom(entity =&amp;gt; entity.ID));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="color: #008000;"&gt;场景2：&lt;/span&gt;IDataReader映射至实体类&lt;/p&gt;&#xD;
&lt;p&gt;代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (IDataReader reader = _db.ExecuteReader(command))&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (reader.Read())&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; AutoMapper.Mapper.DynamicMap&amp;lt;BlogConfig&amp;gt;(reader);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #008000;"&gt;场景3：&lt;/span&gt;列表类型之间的映射，比如：源类型List&amp;lt;BlogSite&amp;gt;，目标类型List&amp;lt;BlogSiteDto&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;AutoMapper.Mapper.CreateMap&amp;lt;BlogSite, BlogSiteDto&amp;gt;();&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; blogSiteDto = AutoMapper.Mapper.Map&amp;lt;List&amp;lt;BlogSite&amp;gt;, List&amp;lt;BlogSiteDto&amp;gt;&amp;gt;(blogSite);&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;注：必须要先通过CreateMap建立BlogSite与BlogSiteDto的映射关系。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; color: #008000;"&gt;场景4：&lt;/span&gt;在映射时为目标实例的属性指定值&lt;/p&gt;&#xD;
&lt;p&gt;代码如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; blogSiteDto = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; BlogSiteDto();&lt;br /&gt;AutoMapper.Mapper.CreateMap&amp;lt;BlogEntry, BlogPostDto&amp;gt;()&lt;br /&gt;                .ForMember(dto =&amp;gt; dto.BlogSiteDto, opt =&amp;gt; opt.UseValue(blogSiteDto));&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;注：BlogSiteDto是BlogPostDto的一个属性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;补充：&lt;/p&gt;&#xD;
&lt;p&gt;AutoMapper的配置（比如AutoMapper.Mapper.CreateMap&amp;lt;BlogSite, BlogSiteDto&amp;gt;();）建议放在程序启动时，比如Global.asax的Application_Start, BootStrapper。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2284828.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/12/16/2284828.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/dudu/archive/2011/12/14/javascript_ie8_onclick.html</id><title type="text">遭遇IE8下的JavaScript兼容问题</title><summary type="text">博客园闪存分页是用JavaScript生成的，今天发现在IE8下点击页码不能翻页，翻页操作是在当前页码的onclick事件中进行的。最终通过a.onclick = function() { eval(js); }解决了问题。</summary><published>2011-12-14T08:40:00Z</published><updated>2011-12-14T08:40:00Z</updated><author><name>dudu</name><uri>http://www.cnblogs.com/dudu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/dudu/archive/2011/12/14/javascript_ie8_onclick.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/dudu/archive/2011/12/14/javascript_ie8_onclick.html"/><content type="html">&lt;p&gt;博客园&lt;a href="http://home.cnblogs.com/ing/" target="_blank"&gt;闪存&lt;/a&gt;分页是用JavaScript生成的，今天发现在IE8下点击页码不能翻页，翻页操作是在当前页码的onclick事件中进行的。&lt;/p&gt;&#xD;
&lt;p&gt;开始代码是这么写的：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; a = document.createElement("a");&lt;br /&gt;a.setAttribute("onclick", &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ClickFunctionName + "(" + pageIndex + ");Pager.SetCurrent(" + pageIndex + ");");&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;由于IE8不支持setAttribute方法，这里添加的onclick事件处理程序并未添加上。&lt;/p&gt;&#xD;
&lt;p&gt;后来改为jQuery的attr方法：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;$(a).attr("onclick", &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ClickFunctionName + "(" + pageIndex + ");Pager.SetCurrent(" + pageIndex + ");");&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样虽然添加上去了，但不管怎么点击，onclick事件处理程序就是不执行，Chrome与Firefox都没这个问题。&lt;/p&gt;&#xD;
&lt;p&gt;最终通过下面的代码解决了问题：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; js = &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ClickFunctionName + "(" + pageIndex + ");Pager.SetCurrent(" + pageIndex + ");";&lt;br /&gt;a.onclick = &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() { eval(js); }&lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/dudu/aggbug/2287760.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/12/14/javascript_ie8_onclick.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
