三种方式让你轻松监控 EntityFramework 中的 sql 流转
大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们无法控制sql的生成策略,所以必须不要让自己缺乏好的工具去监控sql,本篇给大家介绍的三种监控手段Log和SqlServer profile,ef profile。。。
一:Log监控
这个属于entity framework自带的一个Action方法,它给大家带来了不错的用户体验,我们可以将其输出放到控制台,又或者写入到记事本中。。。这里我就通过EDM来生成codefirst,可以看到如下的Database的Log定义,然后大家就可以给他灌入一个带string参数的Action方法,比如Console.WriteLine。
public Action<string> Log { get; set; }
然后写一个 demo 程序
static void Main(string[] args){using (SchoolDB2Entities dbContext = new SchoolDB2Entities()){dbContext.Database.Log = Console.WriteLine;dbContext.Students.Add(new Student(){StudentName = "jack123"});dbContext.SaveChanges();}}
由于codefirst初始化生成之时内容太多,无法一一显示出来。。。为了方便可灌入自定义方法AppendLog,比如将其灌入到File中。。。
二:SqlServer Profile
可以看到SqlServer Profile是放在sqlserver层面上的监控,可以监控到各种sql如何流入到sqlserver中,但是如果你默认开启的话,会看到很多与ef无关的操作,比如下面这样:
那更好的方式是怎么过滤呢?其实也很简单,我们只需要在ef的connectionstring中塞入一个App标记,然后在sqlserver profile上面进行筛选就可以了。
1) 第一步:在connectionstring中加入applicationName
<connectionStrings><add name="SchoolDB2Entities" connectionString="data source=.;initial catalog=SchoolDB2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /></connectionStrings>
2) 第二步:在SqlProfile中筛选ApplicationName=EntityFramework的所有记录
ok,这样我们就配置好了,接下来我们将codefirst跑起来,可以清清楚楚的看到,现在的profile中仅仅只有EntityFramework标记生成的sql语句了。
三:Entity Framework Profile
首先这个是一款商业软件,免费试用期是30天,不过网上还是能够搜索到各种破解版,废话不多说,我们通过nuget下载一下:
下载完之后,再看一下packages文件夹中的子文件夹EntityFrameworkProfiler.3.0.3103.0,找到一个叫做efprof.exe的程序,这个就是要开启的监控。
打开软件后,大家可以自己注册一下,生成一个licence的xml,然后大家就可以看到这样的一个????????的界面了。。。。
更加????????的是,会在我们的Main函数中注入一段开启逻辑,并且在App_Start中生成了一个cs,一个vb文件,如下:
class Program{static void Main(string[] args){App_Start.EntityFrameworkProfilerBootstrapper.PreStart();using (SchoolDB2Entities dbContext = new SchoolDB2Entities()){dbContext.Database.Log = AppendLog;dbContext.Students.Add(new Student(){StudentName = "jack123"});dbContext.SaveChanges();}}static void AppendLog(string str) => System.IO.File.AppendAllText(Environment.CurrentDirectory + "\\1.txt", str, Encoding.Default);}
既然代码都生成好了。。。那就留给我要做的事情就是Ctrl + F5了。
可以看到,efprofile可以抓拍到各种create table语句,包括各种面板信息:Application Statistics,Analysis,Duration等等。。。最重要的我们还能看到 “Query plan”,比如下面我构造一个相对比较复杂的sql语句:
class Program{static void Main(string[] args){App_Start.EntityFrameworkProfilerBootstrapper.PreStart();using (SchoolDB2Entities dbContext = new SchoolDB2Entities()){var query = (from n in dbContext.Studentsfrom m in dbContext.StudentAddresseswhere n.StudentID == m.StudentIDgroup n.StudentID by n.StudentName into gselect new { g.Key, count = g.Count() }).ToList();dbContext.SaveChanges();}}}
然后执行一下,看看efprofile监视到db中是如何生成query plan的快照的。。。
三种方式让你轻松监控 EntityFramework 中的 sql 流转相关推荐
- 三种方法,Python轻松提取PDF中全部图片
有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以轻松搞定! 今天就跟大家系统分享几种Python提取 PDF ...
- WiFi攻击的三种方式
2019独角兽企业重金招聘Python工程师标准>>> 导读 WiFi的安全问题已经引起了不少的使用者重视,甚至已经出现草木皆兵的现象.那么黑客到底是如何做到绕过身份验证来获取WiF ...
- vue 函数 路由跳转_vue中通过路由跳转的三种方式
router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...
- $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式
这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题.大家可以收藏起来,以备用时之需! 1.同源策略 1.1 含义 ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略&q ...
- iOS:延时执行的三种方式
延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObjec ...
- 格式化输出的三种方式
文章目录 格式化输出的三种方式 一.占位符 二.format格式化 三.f-String格式化 格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式 比如要 ...
- Tomcat启动项目的三种方式
Tomcat启动项目的三种方式 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Manager Web应用程序 一:部署解包的webap ...
- sass文件编译的三种方式【舒】
[舒:]sass文件编译的三种方式 方式一: 1.webstorm打开evtGulp项目或者mcake-activity项目 2.中,开启gulp->default/develop,启动watc ...
- SpringBoot静态获取 bean的三种方式,你学会了吗?
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...
最新文章
- 南京大学潘天群教授:人类智能发展的宏大叙事
- Swift 设置字体
- 你应该知道的jQuery技巧【收藏】
- SQL 性能不佳的几个原因
- igs无法分配驱动器映射表_硬盘无法使用,用DiskPart进行分区和格式化,非常简单...
- hive mysql互导_Hive和MySQL数据互导
- iconv命令的使用,解决libxml2中解释中文失败的问题
- HDU2022 海选女主角【入门】
- PDF批量拆分、合并、书签提取、书签写入小工具
- 参加百度开放云编程马拉松后一点总结
- 大学生生涯规划1000字计算机专业,计算机大学生职业生涯规划书1000字
- Wechaty|不使用微信的web协议的机器人
- Halium 9 尝鲜 -- 在小米平板4上的移植 (一)
- 国有企业数字化转型的特殊性
- ASP.NET 在vs中使用Calendar控件 制作一个日历 并标注节假日
- 线上应用故障排查之一:高CPU占用
- HTML表单制作个人简历
- 【LeetCode】详解环形链表141. Linked List Cycle Given a linked list, determine if it has a cycle in it. To
- 刷脸签到python代码_背景提升 | “刷脸”时代,如何运用Python实现人脸识别?
- 【已解决】 com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth
热门文章
- php+mysql实现数据分批插入
- jQuery入门[2]-选择器[转]
- facebook 邀请好友_如何查看紧急情况下您的Facebook朋友是否安全
- facebook人脸照片_为什么您的Facebook照片看起来如此糟糕(以及您可以如何做)...
- 如何解决90%的报表设计难题?300张报表模板任君挑选
- 甘特图看起来很生硬?教你使用智能颜色装饰你的甘特图!(二)
- 学习RUNOOB.COM进度一
- 如何成为有效学习的高手(许岑)——思维导图
- Android TimeAnimator
- java dateTime + long