Entity Framework 6源码学习(一)

来源:互联网 发布:淘宝天猫8折代购原理 编辑:程序博客网 时间:2024/05/16 10:06

设置调试EF环境

下载源代码

打开https://github.com/aspnet/EntityFramework6下载源代码,建议使用Git进行Clone。

重新生成EntityFramework程序集

打开源代码文件夹里的EntityFramework.sln解决方案,尝试编译,发现有错误无法编译通过,发现因为System.Data.SqlServerCe.dll程序集无法找到,需要安装.NET Compact Framework 3.5 Redistributable,再次编译成功。

建立调试解决方案

建立空白解决方案,添加一个Console应用程序EFSample,再将EF源代码文件夹中的EntityFramework和EntityFramework.SqlServer加入到解决方案中,如下图:
这里写图片描述

删除延迟签名

打开EntityFramework项目属性页,发现签名页签下面的”仅延迟签名“被勾上,这样生成的程序集项目无法进行调试,将此选项取消。
这里写图片描述
取消后编译发现程序集无法生成,出现错误。
这里写图片描述
我猜测这是由于EcmaPublicKey.snk文件中只有公钥,没有私钥,无法完成签名(虽然没有找到确切说法,但是多半如此,因为延迟签名正是为了防止私钥泄露),因此可以选择创建一个自己的密钥文件,或者取消”为程序集签名”选项。

添加项目引用

在EFSample中添加对这两个项目的引用
这里写图片描述

建立测试数据库

本机SQLServer中建立MonitorDB数据库,创建表UserInfos。表创建文件为

CreateUserInfos.sql

USE [MonitorDB]GO/****** Object:  Table [dbo].[UserInfos]    Script Date: 2016/8/12 21:19:20 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE 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

创建完成后,在表中填充测试数据。

编写测试代码

在EFSample项目中修改Program.cs, 添加MonitorDB.cs和User.cs文件。

Program.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data.Entity;namespace EFSample{    class Program    {        static void Main(string[] args)        {            using (var context = new MonitorDBContext("Server=.;Database=MonitorDB;Trusted_Connection=True;"))            {                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();            }        }    }}

MonitorDBContext.cs

using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations.Schema;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EFSample{    public class MonitorDBContext : DbContext    {        public MonitorDBContext(string connectionString)            : base(connectionString)        {        }        public IDbSet<User> Users { get; set; }    }}

User.cs

using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations.Schema;using System.Linq;using System.Text;using System.Threading.Tasks;namespace EFSample{    [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; }    }}

开始调试

重新生成成功后,开始运行调试,成功进入EntityFramework源代码断点。
这里写图片描述

总结

设置调试环境,对于理解EntityFramework工作原理和学习源代码尤其重要,但这不是目的,深入了解其代码执行才是目标。

0 0
原创粉丝点击