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源码的更多相关文章

  1. Entity Framework 6源码学习--设置调试EF环境

    下载源代码 打开https://github.com/aspnet/EntityFramework6下载源代码. 建立调试解决方案 建立一个EntityFramework.Sample.sln在Ent ...

  2. 手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)

    手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很 ...

  3. XposedNoRebootModuleSample 不需要频繁重启调试的Xposed 模块源码例子

    XposedNoRebootModuleSample(不需要频繁重启调试的Xposed 模块源码例子) Xposed Module Sample No Need To Reboot When Debu ...

  4. 从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码

    从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码http://www.aboutyun.com/thread-8211-1-1.html(出处: about云开发) ...

  5. windows 下使用 mingw编译器 调试时 无法跟进源码

    windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发,官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时 ...

  6. 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖

    授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是 ...

  7. 手把手带你撸一把springsecurity框架源码中的认证流程

    提springsecurity之前,不得不说一下另外一个轻量级的安全框架Shiro,在springboot未出世之前,Shiro可谓是颇有统一J2EE的安全领域的趋势. 有关shiro的技术点 1.s ...

  8. Visual Studio 2017中使用SourceLink调试ASP.NET Core源码

    背景 当我们在学习ASP.NET Core或者调试ASP.NET Core程序的时候,有时候需要调试底层代码,但是当我们在Visual Studio中调试程序的时候,由于一些基础库或者第三方库缺少pd ...

  9. maven项目debug调试不能够进入源码问题解决

    Maven项目在debug调试模式的时候,进入调试模式,但是没有进入源码界面. 上述问题的解决方法如下: 第一步: 第二步: 第三步: 第四步: 第五步: 到这里就解决了:

随机推荐

  1. javascript的阻塞机制

    javascript的阻塞机制 浏览器在执行javascript代码时,不能同时做其它事情,当遇到javascript时,浏览器会下载js文件,解析并执行该文件,而在这期间页面的渲染是完全被阻塞的,因 ...

  2. LCD实验学习笔记(二):head.S

    ARM加电后从0地址开始取指执行. 连接为bin文件时时,连接脚本lcd.lds指定将head.o放在开头,所以head.S就是系统起步的地方. head.S开头就是异常向量定义,0地址就是reset ...

  3. locust===Writing a locustfile

    The Locust class A locust class represents one user (or a swarming locust if you will). Locust will ...

  4. Linux内核学习之中断 中断本质【转】

    转自:http://www.linuxidc.com/Linux/2011-11/47657.htm [中断概述] 中断本质上是一种特殊的电信号,由硬件设备发向处理器.异常和中断的不同是异常在产生时必 ...

  5. 使用MXNet远程编写卷积神经网络用于多标签分类

    最近试试深度学习能做点什么事情.MXNet是一个与Tensorflow类似的开源深度学习框架,在GPU显存利用率上效率高,比起Tensorflow显著节约显存,并且天生支持分布式深度学习,单机多卡.多 ...

  6. Spark优化之一:分布式下的map操作是闭包

    例如对一个JavaPairRDD<String, String>做遍历操作,常见的,我们可以通过先通过collect()操作将它转化为Map对象再进行遍历,也可以使用Spark提供的map ...

  7. BZOJ 3098

    : Hash Killer II 时间限制: Sec 内存限制: MBSec Special Judge 提交: 解决: [提交][][] 题目描述 这天天气不错,hzhwcmhf神犇给VFleaKi ...

  8. .NET DataSet DataTable 导出excel

    public void CreateExcel(DataSet ds, string FileName) { HttpResponse resp; resp = Page.Response; resp ...

  9. 串行写队列的MYSQL大文本参数

    public void AsyncWriteDataBase() { var spName = ""; while (true) { try { var jsonText = Re ...

  10. 设置iSCSI的发起程序(客户端)(三)

    iSCSI 发起程序是一种用于同 iSCSI 目标器认证并访问服务器上共享的LUN的客户端.我们可以在本地挂载的硬盘上部署任何操作系统,只需要安装一个包来与目标器验证. 初始器客户端设置 功能 可以处 ...