Entity Framework Core 打印SQL語句


先建個表

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[students](
    [stu_id] [INT] IDENTITY(1,1) NOT NULL,
    [stu_name] [NVARCHAR](20) NULL,
    [stu_gender] [CHAR](1) NULL,
    [stu_phone] [VARCHAR](15) NULL,
    [stu_birthday] [DATE] NULL,
 CONSTRAINT [PK_students] PRIMARY KEY CLUSTERED 
(
    [stu_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]
GO

然后創建個.NET CORE 3 項目,NuGet安裝

 

 在“程序包管理控制台中”執行

Scaffold-DbContext "Data Source=localhost;Initial Catalog=數據庫名;User ID=用戶名;Password=密碼" Microsoft.EntityFrameworkCore.SqlServer -OutputDir EfModels

這里使用的是DB First模式,如果數據庫還有更新,我們可以增加一個參數(-Force),這樣可以更新

Scaffold-DbContext "Data Source=localhost;Initial Catalog=數據庫名;User ID=用戶名;Password=密碼" Microsoft.EntityFrameworkCore.SqlServer -OutputDir EfModels -Force

在項目中就有了,如圖

 

 添加兩個類

 1     public class EFLoggerProvider : ILoggerProvider
 2     {
 3         public ILogger CreateLogger(string categoryName) => new EFLogger(categoryName);
 4         public void Dispose() { }
 5     }
 6 
 7     public class EFLogger : ILogger
 8     {
 9         private readonly string categoryName;
10 
11         public EFLogger(string categoryName) => this.categoryName = categoryName;
12 
13         public bool IsEnabled(LogLevel logLevel) => true;
14 
15         public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
16         {
17             //ef core執行數據庫查詢時的categoryName為Microsoft.EntityFrameworkCore.Database.Command,日志級別為Information
18             if (categoryName == "Microsoft.EntityFrameworkCore.Database.Command"
19                     && logLevel == LogLevel.Information)
20             {
21                 var logContent = formatter(state, exception);
22                 //TODO: 拿到日志內容想怎么玩就怎么玩吧
23                 Console.WriteLine();
24                 Console.ForegroundColor = ConsoleColor.Green;
25                 Console.WriteLine(logContent);
26                 Console.ResetColor();
27             }
28         }
29         public IDisposable BeginScope<TState>(TState state) => null;
30     }
View Code

我這里是控制台程序,在ResearchContext中稍作修改就可以了

1 var loggerFactory = new LoggerFactory();
2                 loggerFactory.AddProvider(new EFLoggerProvider());
3 optionsBuilder.UseSqlServer("連接字符串,可從配置文件中讀取")
4                               .UseLoggerFactory(loggerFactory);
View Code

如果是web項目,可以在Startup的ConfigureService中配置

1 services.AddDbContext<YourDbContext>(r => {
2                 //使用ef core mysql 連接
3                 var loggerFactory = new LoggerFactory();
4                 loggerFactory.AddProvider(new EFLoggerProvider());
5  
6                 r.UseSqlServer(Configuration.GetConnectionString("你的連接字符串"))
7                     .UseLoggerFactory(loggerFactory);
8             });
View Code

我們這里是控制台程序,Main方法中的代碼

static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");
Students stu = new Students { StuGender = "0", StuBirthday = DateTime.Now, StuName = "CHAUVET", StuPhone = "17655889687" };
            using (var context = new ResearchContext())
            {
               var id =  await context.Students.AddAsync(stu);
                await context.SaveChangesAsync();

                var obj = await context.Students.Where(p=>p.StuName=="CHAUVET").ToListAsync();

                Console.WriteLine(obj[0].StuName);
            }
        }

效果如圖

 主要參考:https://www.cnblogs.com/hualiu0/p/10826392.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM