大家在学习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 流转相关推荐

  1. 三种方法,Python轻松提取PDF中全部图片

    有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以轻松搞定! 今天就跟大家系统分享几种Python提取 PDF ...

  2. WiFi攻击的三种方式

    2019独角兽企业重金招聘Python工程师标准>>> 导读 WiFi的安全问题已经引起了不少的使用者重视,甚至已经出现草木皆兵的现象.那么黑客到底是如何做到绕过身份验证来获取WiF ...

  3. vue 函数 路由跳转_vue中通过路由跳转的三种方式

    router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...

  4. $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式

    这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题.大家可以收藏起来,以备用时之需! 1.同源策略 1.1 含义 ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略&q ...

  5. iOS:延时执行的三种方式

    延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObjec ...

  6. 格式化输出的三种方式

    文章目录 格式化输出的三种方式 一.占位符 二.format格式化 三.f-String格式化 格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式 比如要 ...

  7. Tomcat启动项目的三种方式

    Tomcat启动项目的三种方式 在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Manager Web应用程序 一:部署解包的webap ...

  8. sass文件编译的三种方式【舒】

    [舒:]sass文件编译的三种方式 方式一: 1.webstorm打开evtGulp项目或者mcake-activity项目 2.中,开启gulp->default/develop,启动watc ...

  9. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

最新文章

  1. 南京大学潘天群教授:人类智能发展的宏大叙事
  2. Swift 设置字体
  3. 你应该知道的jQuery技巧【收藏】
  4. SQL 性能不佳的几个原因
  5. igs无法分配驱动器映射表_硬盘无法使用,用DiskPart进行分区和格式化,非常简单...
  6. hive mysql互导_Hive和MySQL数据互导
  7. iconv命令的使用,解决libxml2中解释中文失败的问题
  8. HDU2022 海选女主角【入门】
  9. PDF批量拆分、合并、书签提取、书签写入小工具
  10. 参加百度开放云编程马拉松后一点总结
  11. 大学生生涯规划1000字计算机专业,计算机大学生职业生涯规划书1000字
  12. Wechaty|不使用微信的web协议的机器人
  13. Halium 9 尝鲜 -- 在小米平板4上的移植 (一)
  14. 国有企业数字化转型的特殊性
  15. ASP.NET 在vs中使用Calendar控件 制作一个日历 并标注节假日
  16. 线上应用故障排查之一:高CPU占用
  17. HTML表单制作个人简历
  18. 【LeetCode】详解环形链表141. Linked List Cycle Given a linked list, determine if it has a cycle in it. To
  19. 刷脸签到python代码_背景提升 | “刷脸”时代,如何运用Python实现人脸识别?
  20. 【已解决】 com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth

热门文章

  1. php+mysql实现数据分批插入
  2. jQuery入门[2]-选择器[转]
  3. facebook 邀请好友_如何查看紧急情况下您的Facebook朋友是否安全
  4. facebook人脸照片_为什么您的Facebook照片看起来如此糟糕(以及您可以如何做)...
  5. 如何解决90%的报表设计难题?300张报表模板任君挑选
  6. 甘特图看起来很生硬?教你使用智能颜色装饰你的甘特图!(二)
  7. 学习RUNOOB.COM进度一
  8. 如何成为有效学习的高手(许岑)——思维导图
  9. Android TimeAnimator
  10. java dateTime + long