Entity Framework 6原始碼學習(一)
阿新 • • 發佈:2019-02-02
設定除錯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工作原理和學習原始碼尤其重要,但這不是目的,深入瞭解其程式碼執行才是目標。