EF-记录程序自动生成并执行的sql语句日志

Posted 夜月天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF-记录程序自动生成并执行的sql语句日志相关的知识,希望对你有一定的参考价值。

在EntityFramework的CodeFirst模式中,我们想将程序自动生成的sql语句和执行过程记录到日志中,方便以后查看和分析。

在EF的6.x版本中,在DbContext中有一个Database属性,Database.Log就是用来专门记录这种日志的。

Database.Log是一个Action<string>委托,给其赋值一个函数就行。

代码如下:

using Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace DAL {
    public class DemoContext:DbContext {
        //使用name=EFDemo的连接字符串
        public DemoContext() : base("EFDemo") {

            //设置数据库初始化方式 为 迁移(更新)数据库到最新的版本
            //DemoContext 映射数据库和表 
            //DAL.Migrations.Configuration 是迁移配置
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<DemoContext, DAL.Migrations.Configuration>());
            
            //将执行的sql语句记录到日志
            Database.Log = message=>Console.WriteLine("[{0}]{1}-- {2}",Thread.CurrentThread.ManagedThreadId,DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"),message.Trim());
        }

        //Students属性对应数据库中的Student表
        public virtual DbSet<Student> Students { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);
        }
    }
}

应用程序中的代码如下:

using (DemoContext context = new DemoContext()) {
                //在使用模型类之前需要强制创建数据库 true:强制创建
                context.Database.Initialize(true);

                #region 新增

                Student stu = new Student {
                    Name = "赵子成",
                    BirthDay = DateTime.Parse("1990-08-01"),
                    Age = 27
                };

                //新增一个Student实体,相当于在Student表中,新增一条数据
                context.Students.Add(stu);              

                //保存
                context.SaveChanges();
              
                #endregion
}

日志记录的结果如下:

[10]2017/07/29 16:57:28.971-- Opened connection at 2017/07/29 16:57:28 +08:00
[10]2017/07/29 16:57:28.972-- Started transaction at 2017/07/29 16:57:28 +08:00
[10]2017/07/29 16:57:28.977-- DECLARE @generated_keys table([ID] uniqueidentifier)
INSERT [dbo].[Student]([Name], [BirthDay], [Age], [Address])
OUTPUT inserted.[ID] INTO @generated_keys
VALUES (@0, @1, @2, NULL)
SELECT t.[ID], t.[RowVersion]
FROM @generated_keys AS g JOIN [dbo].[Student] AS t ON g.[ID] = t.[ID]
WHERE @@ROWCOUNT > 0
[10]2017/07/29 16:57:28.977--
[10]2017/07/29 16:57:28.978-- -- @0: 赵子成 (Type = String, Size = 50)
[10]2017/07/29 16:57:28.978-- -- @1: 1990/08/01 00:00:00 (Type = DateTime2)
[10]2017/07/29 16:57:28.978-- -- @2: 27 (Type = Int32)
[10]2017/07/29 16:57:28.978-- -- Executing at 2017/07/29 16:57:28 +08:00
[10]2017/07/29 16:57:28.993-- -- Completed in 14 ms with result: SqlDataReader
[10]2017/07/29 16:57:28.993--
[10]2017/07/29 16:57:28.995-- Committed transaction at 2017/07/29 16:57:28 +08:00
[10]2017/07/29 16:57:28.996-- Closed connection at 2017/07/29 16:57:28 +08:00

 

以上是关于EF-记录程序自动生成并执行的sql语句日志的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Persistent 启用自动记录 SQL 语句

请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?

使用 JDBC 时如何为 SQL 语句启用日志记录

EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

EF Core使用Simple Logging输出日志

EF 迁移控制日志记录 SQL