下载源代码
打开https://github.com/aspnet/EntityFramework6下载源代码。
建立调试解决方案
建立一个EntityFramework.Sample.sln在EntityFramework6根目录,建一个Console工程在src目录下,再将EF源代码文件夹中的EntityFramework和EntityFramework.SqlServer加入到解决方案中。如下图所示:
删除延迟签名
打开EntityFramework、EntityFramework.SqlServer项目属性页,发现签名页签下面的”Delay sign only“被勾上,这样生成的程序集项目无法进行调试,将Sign the assembly取消勾选。如下图所示:
添加项目引用
在EntityFramework.Sample中添加对EntityFramework、EntityFramework.SqlServer这两个项目的引用。如下图所示:
建立测试数据库
打开Microsoft SQL Server Management Studio,创建DB,名字为EFDB,然后选中新创建DB点击菜单栏New Query。
USE [EFDB] GO /****** Object: Table [dbo].[UserInfos] Script Date: 6/15/2018 1:18:35 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[UserInfos]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, [Email] [nvarchar](max) NULL, [QQ] [nvarchar](max) NULL, [Position] [nvarchar](max) NOT NULL, [FirstLevel] [nvarchar](max) NOT NULL, [SecondLevel] [nvarchar](max) NOT NULL, [Mobile] [nvarchar](max) NULL, CONSTRAINT [PK_UserInfos] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO
编写测试代码
在EntityFramework.Sample项目中修改Program.cs, 添加EFDBContext.cs和User.cs文件。
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EntityFramework.Sample { class Program { static void Main(string[] args) { using (var context = new EFDBContext("Server=10.1.55.166;Database=EFDB;Password=1qaz2wsxE;User ID=sa")) { var users = context.Users.ToList(); Console.WriteLine("{0,6} {1,5} {2,20}", "ID", "Name", "Email"); foreach (var user in users) { Console.WriteLine("{0,6} {1,5} {2,20}", user.Id, user.Name, user.Email); } Console.ReadKey(); } } } }
User.cs
using System.ComponentModel.DataAnnotations.Schema; namespace EntityFramework.Sample { [Table("UserInfos")] public partial class User { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public string QQ { get; set; } public string Position { get; set; } public string FirstLevel { get; set; } public string SecondLevel { get; set; } public string Mobile { get; set; } } }
EFDBContext.cs
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EntityFramework.Sample { public class EFDBContext : DbContext { public EFDBContext(string connectionString) : base(connectionString) { } public IDbSet<User> Users { get; set; } } }
开始调试
重新生成成功后,开始运行调试,成功进入EntityFramework源代码断点。 但是在运行时加载EntityFramework.SqlServer程序集失败,虽然上面去掉强签名,但是加载的时候仍然存在强签名,最后Debug跟踪,发现源码中默认没有给Provider会默认加载EntityFramework.SqlServer,并且是带有强签名的,只需要把这里的强签名去掉即可,如下图所示:
总结
设置调试环境,对于理解EntityFramework工作原理和学习源代码尤其重要,但这不是目的,深入了解其代码执行才是目标。