zoukankan      html  css  js  c++  java
  • Entity Framework 6源码学习--设置调试EF环境

    下载源代码

    打开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工作原理和学习源代码尤其重要,但这不是目的,深入了解其代码执行才是目标。

  • 相关阅读:
    常见的分布
    ubuntu16.04获取root权限并用root用户登录
    神经网络与深度学习邱锡鹏学习笔记16多项式回归
    什么是公版显卡,什么是非公版显卡
    高考电子监控揭秘
    买了个2手睡袋
    HTML
    又是一天
    我也想去看珠峰
    Qt 主界面菜单栏和状态栏实现
  • 原文地址:https://www.cnblogs.com/zhesong/p/EF6Debug.html
Copyright © 2011-2022 走看看