手把手教你调试Entity Framework 6源码
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有所区别,主要是连接字符串上的区别。
<?xml version="1.0" encoding="utf-8"?> <configuration>
<configSections>
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient"
type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
section节点的版本信息很关键,如果版本错了,则运行报错。
至此,配置工作已全部完成。最后,编写几个简单的类进行调试。
5 以Code First方式创建数据库并调试
创建一个只包含一个表的数据库,代码如下:
namespace EFSrcTest
{
class Teacher
{
public int ID { get; set; }
public string FirstName { get; set; }
}
}
namespace EFSrcTest
{
class SchoolContext : DbContext
{
public DbSet<Teacher> Teachers { get; set; }
}
}
namespace EFSrcTest
{
class Program
{
static void Main(string[] args)
{
using (var ctx = new SchoolContext())
{
ctx.Teachers.Add(new Teacher { FirstName = "米高" });
ctx.SaveChanges();
}
}
}
}
现在,对第7行using (var ctx = new SchoolContext())打上断点进行调试,按F11可进入EF源码,如下图所示。

现在,开启你的Entity Framework 6源码调试旅途吧。
手把手教你调试Entity Framework 6源码的更多相关文章
- Entity Framework 6源码学习--设置调试EF环境
下载源代码 打开https://github.com/aspnet/EntityFramework6下载源代码. 建立调试解决方案 建立一个EntityFramework.Sample.sln在Ent ...
- 手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)
手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很 ...
- XposedNoRebootModuleSample 不需要频繁重启调试的Xposed 模块源码例子
XposedNoRebootModuleSample(不需要频繁重启调试的Xposed 模块源码例子) Xposed Module Sample No Need To Reboot When Debu ...
- 从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码
从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码http://www.aboutyun.com/thread-8211-1-1.html(出处: about云开发) ...
- windows 下使用 mingw编译器 调试时 无法跟进源码
windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发,官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时 ...
- 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖
授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是 ...
- 手把手带你撸一把springsecurity框架源码中的认证流程
提springsecurity之前,不得不说一下另外一个轻量级的安全框架Shiro,在springboot未出世之前,Shiro可谓是颇有统一J2EE的安全领域的趋势. 有关shiro的技术点 1.s ...
- Visual Studio 2017中使用SourceLink调试ASP.NET Core源码
背景 当我们在学习ASP.NET Core或者调试ASP.NET Core程序的时候,有时候需要调试底层代码,但是当我们在Visual Studio中调试程序的时候,由于一些基础库或者第三方库缺少pd ...
- maven项目debug调试不能够进入源码问题解决
Maven项目在debug调试模式的时候,进入调试模式,但是没有进入源码界面. 上述问题的解决方法如下: 第一步: 第二步: 第三步: 第四步: 第五步: 到这里就解决了:
随机推荐
- (转)Git冲突:commit your changes or stash them before you can merge. 解决办法
用git pull来更新代码的时候,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...
- ANDROID开发笔记(一)
manifest, 英['mænɪfest] vt. 显示,表明;证明;使显现 adj. 明白的,明显的 n. 货单,旅客名单 wrap_content, 根据实际内容调整 原来新版的ADB已经支 ...
- python基础===map和zip的用法
>>> list1=[1,45,232,45,666,64] >>> list2=["ss","kein","to ...
- 《Java编程思想》笔记 第五章 初始化与清理
1.构造器 因为创建一个类的对象构造器就会自动执行,故初始化某些东西特好 2.方法重载 方法名相同,参数列表不同. 2.1 区分重载方法 方法重载后区别不同方法的就是方法签名 -->参数类型和个 ...
- getResourceAsStream用法详解
//使用绝对路径,否则无法读取config.properties //InputStream inStream=new FileInputStream("F:\\android\\test\ ...
- Nginx-Primary script unknown的报错的解决方法
配置nginx时一直报错:file not found 错误日志: [error] 12691#0: *6 FastCGI sent in stderr: "Primary script u ...
- 如何通过chrome的开发者工具查找新浪评论数据在哪个文件
1.打开开发者工具(ctrl+shift+i) 2.打开搜索(Esc) 示例:http://comment5.news.sina.com.cn/page/info?format=js&chan ...
- [UML] 如何找参与者、找用例
如何找参与者 1.谁会来使用这个系统? 2.谁会来安装这个系统? 3.谁会来启动这个系统? 4.谁会来维护这个系统? 5.谁会来关闭这个系统? 6.哪些系统会来使用这个系统? 7.谁会从这个系统获取信 ...
- RabbitMQ (七) 订阅者模式之主题模式 ( topic )
主题模式和路由模式很像 路由模式是精确匹配 主题模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string E ...
- notepad++ 删除重复记录
sort line with Edit -> Line Operations -> Sort Lines Lexicographically ascending do a Find / R ...