1. 程式人生 > >Entity Framework 6原始碼學習(一)

Entity Framework 6原始碼學習(一)

設定除錯EF環境

下載原始碼

重新生成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 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

建立完成後,在表中填充測試資料。

編寫測試程式碼

在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工作原理和學習原始碼尤其重要,但這不是目的,深入瞭解其程式碼執行才是目標。