0 摘要
本文講述在Visual Studio 2013(VS 2013)下調試Entity Framework 6(EF 6)源碼的配置過程。原則上,VS 2012也適用。
之前打算編寫《Entity Framework 6 源碼調試與分析》系列博文,現因個人健康原因,需休息較長時間,不得不放棄這一計划。離開前,把調試EF源碼的辦法寫成教程,希望對那些像我一樣的新手有所幫助。
1 正文
我的軟件環境
操作系統: Windows 8.1 Update 1
IDE : Visual Studio 2013 Update 2
理論上,只要安裝了VS 2013即可。
0 下載EF 6源碼
最新的源碼是EF 6.1.0,需用Git獲取代碼。關於如何在Windows下安裝配置Git,不在本文討論范圍內。
在EF主頁上找到SOURCE CODE標簽,點擊Clone,得到git clone地址https://git01.codeplex.com/entityframework,如下圖所示。

使用Git獲取EF源碼,完整代碼如下圖所示。

現在,直接打開EntityFramework.sln就可以調試EF源碼。下面以新建解決方案的方式,將EF源碼添加到我們的項目中進行調試。
1 建立一個控制台項目
在VS中創建一個C#控制台項目,.NET版本可選4.5或4.5.1,建議選4.5,項目名稱隨意,如下圖所示。其他項目類型如MVC也可以,看個人喜好。

2 添加EntityFramework及EntityFramework.SqlServer到解決方案中
通過添加已存在的項目到解決方案中,我們得到了標題中兩個項目的引用(具體路徑為你存放EF源碼的路徑),如下圖所示。


以同樣的方式添加對EntityFramework.SqlServer項目的引用,結果如下圖所示。

在EFSrcTest項目中添加對這兩個項目的引用。
3 編譯EntityFramework及EntityFramework.SqlServer項目
這一步有兩種做法:
一是修改這兩個項目的輸出路徑到步驟一所建的控制台項目的debug目錄或者你指定的目錄;
二是編譯這兩個項目,然后把DLL復制到你的項目的debug或者你指定的目錄,缺點是你對EF源碼所作的修改,重新編譯后都需要再次復制DLL到你指定的目錄才能生效。不過,像我這樣的初學者是不太可能修改EF源碼的,所以按方式二繼續。
編譯控制台項目,復制EntityFramework及EntityFramework.SqlServer項目輸出的DLL及PDB符號文件到控制台項目的Debug目錄下(或你指定的目錄,在此不再贅述),如下圖所示。

4 配置控制台項目的App.Config文件
這里以Code First方式進行,配置內容和Mode First、Database First有所區別,主要是連接字符串上的區別。
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <configuration> 4 <configSections> 5 <section name="entityFramework" 6 type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 7 requirePermission="false" /> 8 </configSections> 9 <startup> 10 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 11 </startup> 12 <entityFramework> 13 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 14 <parameters> 15 <parameter value="v11.0" /> 16 </parameters> 17 </defaultConnectionFactory> 18 <providers> 19 <provider invariantName="System.Data.SqlClient" 20 type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 21 </providers> 22 </entityFramework> 23 </configuration>
section節點的版本信息很關鍵,如果版本錯了,則運行報錯。
至此,配置工作已全部完成。最后,編寫幾個簡單的類進行調試。
5 以Code First方式創建數據庫並調試
創建一個只包含一個表的數據庫,代碼如下:
1 namespace EFSrcTest 2 { 3 class Teacher 4 { 5 public int ID { get; set; } 6 public string FirstName { get; set; } 7 } 8 }
1 namespace EFSrcTest 2 { 3 class SchoolContext : DbContext 4 { 5 public DbSet<Teacher> Teachers { get; set; } 6 } 7 }
1 namespace EFSrcTest 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 using (var ctx = new SchoolContext()) 8 { 9 ctx.Teachers.Add(new Teacher { FirstName = "米高" }); 10 ctx.SaveChanges(); 11 } 12 } 13 } 14 }
現在,對第7行using (var ctx = new SchoolContext())打上斷點進行調試,按F11可進入EF源碼,如下圖所示。

現在,開啟你的Entity Framework 6源碼調試旅途吧。
