02020406 EF Core基础06-EF Core生成的SQL

news/2025/9/23 23:14:35/文章来源:https://www.cnblogs.com/python-web/p/19108340

02020406 EF Core基础06-EF Core生成的SQL

1. 通过代码查看EF Core的SQL语句(视频3-12)

1.1 方法1:标准日志
// 标准日志用法示例
public static readonly ILoggerFactory MyLoggerFactory= LoggerFactory.Create(builder => { builder.AddConsole(); });optionsBuilder.UseLoggerFactory(MyLoggerFactory);
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 需要安装的包
1. microsoft.entityframeworkcore.sqlserver -Version 5.0.4
2. microsoft.entityframeworkcore.tools -Version 5.0.4
3. install-package microsoft.extensions.logging.console -version 5.0.0
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Dog.cs
namespace DBLogDemo
{public class Dog{public long Id { get; set; }public string Name { get; set; }}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// DbContext.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;namespace DBLogDemo
{class MyDbContext : DbContext{private static ILoggerFactory loggerFactory = LoggerFactory.Create(b => b.AddConsole()); // @1public DbSet<Dog> Dogs { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);optionsBuilder.UseLoggerFactory(loggerFactory); // @2}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System;
using System.Threading.Tasks;namespace DBLogDemo
{class Program{static async Task Main(string[] args){using (MyDbContext ctx = new MyDbContext()){Dog d01 = new Dog();d01.Name = "abc";ctx.Dogs.Add(d01);await ctx.SaveChangesAsync();d01.Name = "abc";Console.WriteLine(d01.Id);}Console.ReadLine();}}
}控制台输出:
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]Entity Framework Core 5.0.4 initialized 'MyDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]Executed DbCommand (31ms) [Parameters=[@p0='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']SET NOCOUNT ON; // 标准SQL语句startINSERT INTO [Dogs] ([Name])VALUES (@p0);SELECT [Id]FROM [Dogs]WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity(); // 标准SQL语句end
2 // Id值
1.2 方法2:简单日志
// 简单日志用法示例
optionsBuilder.LogTo(Console.WriteLine);
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 需要安装的包
1. microsoft.entityframeworkcore.sqlserver -version 5.0.4
2. microsoft.entityframeworkcore.tools -version 5.0.4
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Dog.cs
namespace DBLogDemo
{public class Dog{public long Id { get; set; }public string Name { get; set; }}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// DbContext.cs
using Microsoft.EntityFrameworkCore;namespace DBLogDemo
{class MyDbContext : DbContext{public DbSet<Dog> Dogs { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);optionsBuilder.LogTo( msg => {System.Console.WriteLine(msg);}); // LogTo参数为string形式的委托}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Program.cs
using System;
using System.Threading.Tasks;namespace DBLogDemo
{class Program{static async Task Main(string[] args){using (MyDbContext ctx = new MyDbContext()){Dog d01 = new Dog();d01.Name = "abc";ctx.Dogs.Add(d01);await ctx.SaveChangesAsync();d01.Name = "abc";Console.WriteLine(d01.Id);}Console.ReadLine();}}
}控制台输出:
info: 2025/9/21 20:38:14.997 CoreEventId.ContextInitialized[10403] (Microsoft.EntityFrameworkCore.Infrastructure)
...SaveChanges completed for 'MyDbContext' with 1 entities written to the database.
3 // Id值
dbug: 2025/9/21 20:38:15.510 CoreEventId.ContextDisposed[10407] (Microsoft.EntityFrameworkCore.Infrastructure)'MyDbContext' disposed.说明:
1. 用起来简单,但是看起来好多啊-_-。
2. 可以输出EF Core整个生命周期的日志信息。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// DbContext.cs
using Microsoft.EntityFrameworkCore;namespace DBLogDemo
{class MyDbContext : DbContext{public DbSet<Dog> Dogs { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);optionsBuilder.LogTo( msg => { if (!msg.Contains("CommandExecuting")) return; System.Console.WriteLine(msg);}); // 过滤信息,只要SQL语句部分。}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Program.csusing System;
using System.Threading.Tasks;namespace DBLogDemo
{class Program{static async Task Main(string[] args){using (MyDbContext ctx = new MyDbContext()){Dog d01 = new Dog();d01.Name = "abc";ctx.Dogs.Add(d01);await ctx.SaveChangesAsync();d01.Name = "abc";Console.WriteLine(d01.Id);}Console.ReadLine();}}
}控制台输出:
dbug: 2025/9/21 20:46:21.950 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)Executing DbCommand [Parameters=[@p0='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']SET NOCOUNT ON;INSERT INTO [Dogs] ([Name])VALUES (@p0);SELECT [Id]FROM [Dogs]WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();
5说明:只输出SQL语句部分。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Program.cs,演示多条SQL语句。
using System;
using System.Linq;
using System.Threading.Tasks;namespace DBLogDemo
{class Program{static async Task Main(string[] args){using (MyDbContext ctx = new MyDbContext()){Dog d01 = new Dog();d01.Name = "abc";ctx.Dogs.Add(d01); // SQL语句1ctx.Dogs.Add(new Dog { Name = "Trump" }); // SQL语句2await ctx.SaveChangesAsync();Console.WriteLine(ctx.Dogs.Count()); // SQL语句3}Console.ReadLine();}}
}控制台输出:
dbug: 2025/9/21 20:52:51.558 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)Executing DbCommand [Parameters=[@p0='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']SET NOCOUNT ON;INSERT INTO [Dogs] ([Name])VALUES (@p0);SELECT [Id]FROM [Dogs]WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();
dbug: 2025/9/21 20:52:51.624 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)Executing DbCommand [Parameters=[@p0='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']SET NOCOUNT ON;INSERT INTO [Dogs] ([Name])VALUES (@p0);SELECT [Id]FROM [Dogs]WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();
dbug: 2025/9/21 20:52:51.854 RelationalEventId.CommandExecuting[20100] (Microsoft.EntityFrameworkCore.Database.Command)Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']SELECT COUNT(*)FROM [Dogs] AS [d]说明:过滤后每个SQL操作的语句都可以查到,如果SQL操作很多,那么输出很多个SQL语句,查起来会很麻烦。可以定向的找到所需要的SQL语句。
1.3 方法3:ToQueryString
1、上面两种方式无法直接得到一个操作的SQL语句,而且在操作很多的情况下,容易混乱。
2、EF Core的Where方法返回的是IQueryable类型,DbSet也实现了IQueryable接口。 IQueryable有扩展方法ToQueryString()可以获得SQL。
3、不需要真的执行查询才获取SQL语句;只能获取查询操作的。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Dog.cs
namespace DBLogDemo
{public class Dog{public long Id { get; set; } //主键public string Name { get; set; }//标题}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// MyDbContext
using Microsoft.EntityFrameworkCore;namespace DBLogDemo
{class MyDbContext : DbContext{public DbSet<Dog> Dogs { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;namespace DBLogDemo
{class Program{static async Task Main(string[] args){using (MyDbContext ctx = new MyDbContext()){Dog d01 = new Dog();d01.Name = "abc";ctx.Dogs.Add(d01);ctx.Dogs.Add(new Dog { Name = "Trump" }); // 拿不到await ctx.SaveChangesAsync();Console.WriteLine(ctx.Dogs.Count()); // 拿不到IQueryable<Dog> dogs01 = ctx.Dogs.Where(d => d.Name.ToLower() == "Trump");string sql = dogs01.ToQueryString();Console.WriteLine("这就是我要的SQL语句:" + sql); // ToQueryStirng只能拿到查询操作的SQL语句/*foreach (var it in d02){Console.WriteLine(it.Id);}*/}Console.ReadLine();}}
}控制台输出:
13
SELECT [d].[Id], [d].[Name]
FROM [Dogs] AS [d]
WHERE LOWER([d].[Name]) = N'Trump'说明:
1. ToQueryString方法只能拿到查询操作的SQL语句,其它形式的SQL语句拿不到。
2. ToQueryString方法可以在不真的执行数据库查询的情形下直接拿到查询结果,后续课程会演示。
1.4 总结
  • 写测试性代码,用简单日志;
  • 正式需要记录SQL给审核人员或者排查故障,用标准日志;
  • 开发阶段,从繁杂的查询操作中立即看到SQL,用ToQueryString()。

2. 同样的LINQ被翻译为不同的SQL语句(视频3-13)

  • 本课跳过,目前只针对性的学习SQL Server。本机也没安装其它数据库,无法演示。
  • 后续用得到再补。

结尾

书籍:ASP.NET Core技术内幕与项目实战

视频:https://www.bilibili.com/video/BV1pK41137He

著:杨中科

ISBN:978-7-115-58657-5

版次:第1版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/914194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京网站建设工作南京专业做网站的公司有哪些

面试中的收获&#xff1a; 优点&#xff1a; 1. 设计用例考虑较为全面。 2. 自动化&#xff0c;性能都有涉猎&#xff0c;但不深入。 3. 对业务理解较深入。 缺点&#xff1a; 1. 接口自动化停留在初级阶段。 2. UI自动化了解较少。 3. 性能压测缺少数据清洗等步骤。 4. 算法还…

菲斯曼售后服务中心贵港seo关键词整站优化

拦截器-interceptor 在现代的一些前端框架上&#xff0c;拦截器基本上是很基础但很重要的一环&#xff0c;比如Angular原生就支持拦截器配置&#xff0c;VUE的Axios模块也给我们提供了拦截器配置&#xff0c;那么拦截器到底是什么&#xff0c;它有什么用&#xff1f;拦截器能帮…

网站打不开服务器错误建手机网站多少钱

给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。解集不能包含重复的组合。 …

温州专业网站建设公司wordpress的链接怎么设置

把这个项目的文档迁入到SVN Server上的库中 【1】首先右键点击projectAdmin目录&#xff0c;这时候的右键菜单例如以下图看到的&#xff1a;选择copy URL toCLipboard,就是复制统一资源定位符&#xff08;URL&#xff09;到剪贴板中 https://KJ-AP01.中国.corpnet:8443/svn/pro…

中山建设监理有限公司 网站扁平化网站首页

随着数字化时代的来临&#xff0c;装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序&#xff0c;装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…

服装商城网站模板wordpress极简模板

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

网站编程培训班开发微信商城平台

串的概念&#xff1a;串&#xff08;字符串&#xff09;&#xff1a;是由 0 个或多个字符组成的有限序列。 通常记为&#xff1a;s ‘ a1 a2 a3 … ai …an ’ ( n≥0 )。 串的逻辑结构和线性表极为相似。 一些串的类型&#xff1a; 空串&#xff1a;不含任何字符的串&#x…

信阳公司做网站托管管理系统app

目录 主要内容 模型研究 1.模型总览 2.boost模块 3.Inverter模块 4.控制模块 5.信号模块 结果一览 下载链接 主要内容 该模型为光伏逆变器低电压穿越仿真模型&#xff0c;采用boost加NPC拓扑结构&#xff0c;基于MATLAB/Simulink建模仿真。模型具备中点平衡…

网页设计动态效果怎么制作西安seo优化公司

本问题已经有最佳答案&#xff0c;请猛点这里访问。下面两个SQL查询有什么区别和号根据以下两个测试结果速度更快(237比460)。据我所知&#xff0c;这是一个标准。。氧化镁不&#xff0c;有细微的差别&#xff0c;你不能说没有差别除了语法之外没有别的区别。虽然只有一个简短的…

用于做网站的软件wordpress微信公众号开发

MR混合现实情景实训教学系统是一种将虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;相结合的先进技术。在法律教学课堂上&#xff0c;MR教学系统为学生模拟模拟法庭、案例分析等多种形式&#xff0c;让学生在实践中掌握法律知识&#xff0c;提高法律…

新余 网站建设做手机网站多少钱

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

甘肃省建设工程网上投标网站成都住房和城乡建设局网站首页

背景&#xff1a; staticMesh 会根据业务需要随时变化&#xff0c;然后通过staticMesh的大小自适应相机位置&#xff0c;捕捉画面用来预览该模型&#xff0c;使模型在画布中不会太大导致显示不全&#xff0c;也不会太小 参考&#xff1a; UE实现相机聚焦物体功能_右弦GISer的…

网页设计素材网站大全展馆设计都是找的什么公司

1. 概述Linux系统启动过程中通过init_task创建0号idle进程。然后通过kernel_thread创建1号init进程。创建该进程时通过系统调用&#xff0c;在内核空间执行用户空间的/sbin/init程序&#xff0c;通过该程序产生出shell&#xff0c;并依赖init衍生出其他进程。通过top命令查看当…

最基本的网络营销站点中小企业网站制作报价

题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔。 简单来说&#xff0c;这款游戏是在一个平面上进行的。 有一架弹弓位于(0,0)处&#xff0c;每次Kiana可以用它向第一象限发射一只红色的小鸟&#xff0c;小鸟们的飞行轨迹均为形如的曲线&#xff0c;其中a,b是Kiana指定的参数…

河南省住建厅网站豫建设标微信推广平台

1. 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&…

杭州低价做网站国内永久免费域名申请网站

1、new Function的基础概念 new Function() 是 JavaScript 中的一个构造函数&#xff0c;它可以实例化一个新的函数对象并返回。该函数对象可以使用传递给 new Function() 的字符串参数作为函数体&#xff0c;并使用其他传递给它的参数作为函数参数&#xff0c;从而动态创建一…

云虚拟主机怎么使用沈阳网站的优化

SPM SPM&#xff08;shopping page mark&#xff0c;导购页面标记&#xff09; 是淘宝社区电商业务&#xff08;xTao&#xff09;为外部合作伙伴&#xff08;外站&#xff09;提供的跟踪引导成交效果数据的解决方案 注&#xff1a;也有解释 SPM 为超级位置模型(Super Position…

如何优化网站代码萍乡网站制作公司

Redis主从架构 Redis主从工作原理数据部分复制 Redis哨兵高可用架构client连接哨兵规则主节点挂了&#xff0c;集群从新选择主节点&#xff0c;并且同步给sentinel 转自图灵课堂 redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a; 1、复制一份redis.conf文件2、将相关…

南昌高端网站开发建设高端网站公司哪家好

文章目录 1. 引言2. WebSocket和EventSource简介2.1 WebSocket2.2 EventSource 3. ChatGPT对话系统的特点4. EventSource的优势4.1 简单易用4.2 容错性强4.3 兼容性良好 5. 为何选择EventSource而非WebSocket&#xff1f;5.1 单向通信模式5.2 长轮询模式5.3 简化部署和维护 6. …

网站节约化建设上海计算机考试网页制作

唯品会商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取唯品会商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问唯品会商城的网页来获取商品详情信息。以下是两种常用方法的介…