监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们
无法控制sql的生成策略,所以必须不要让自己缺乏好的工具去监控sql,本篇给大家介绍的三种监控手段Log和SqlServer profile,ef profile。。。
一:Log监控
这个属于entity framework自带的一个Action方法,它给大家带来了不错的用户体验,我们可以将其输出放到控制台,又或者写入到记事本中。。。这
里我就通过EDM来生成codefirst,可以看到如下的Database的Log定义,然后大家就可以给他灌入一个带string参数的Action方法,比如Console.WriteLine。
//
// 摘要:
// Set this property to log the SQL generated by the System.Data.Entity.DbContext
// to the given delegate. For example, to log to the console, set this property
// to System.Console.Write(System.String).
//
// 备注:
// The format of the log text can be changed by creating a new formatter that derives
// from System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter and
// setting it with System.Data.Entity.DbConfiguration.SetDatabaseLogFormatter(System.Func{System.Data.Entity.DbContext,System.Action{System.String},System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter}).
// For more low-level control over logging/interception see System.Data.Entity.Infrastructure.Interception.IDbCommandInterceptor
// and System.Data.Entity.Infrastructure.Interception.DbInterception.
public Action<string> Log { get; set; }
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上面进行筛选就可以了。
第一步:在connectionstring中加入applicationName
<connectionStrings>
<add name="SchoolDB2Entities" connectionString="data source=.;initial catalog=SchoolDB2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
第二步:在SqlProfile中筛选ApplicationName=EntityFramework的所有记录

ok,这样我们就配置好了,接下来我们将codefirst跑起来,可以清清楚楚的看到,现在的profile中仅仅只有EntityFramework标记生成的sql语句了。

三:Entity Framework Profile
首先这个是一款商业软件,免费试用期是30天,不过网上还是能够搜索到各种破解版,废话不多说,我们通过nuget下载一下:

PM> Install-Package EntityFrameworkProfiler
正在尝试收集与目标为“.NETFramework,Version=v4.”的项目“ConsoleApplication37”有关的程序包“EntityFrameworkProfiler.3.0.”的相关依赖项信息
正在尝试解析程序包“EntityFrameworkProfiler.3.0.”的依赖项,DependencyBehavior 为“Lowest”
正在解析操作以安装程序包“EntityFrameworkProfiler.3.0.”
已解析操作以安装程序包“EntityFrameworkProfiler.3.0.”
正在将程序包“Microsoft.Web.Infrastructure.1.0.”添加到文件夹“c:\users\xchuang\documents\visual studio \Projects\ConsoleApplication37\packages”
已将程序包“Microsoft.Web.Infrastructure.1.0.”添加到文件夹“c:\users\xchuang\documents\visual studio \Projects\ConsoleApplication37\packages”
已将程序包“Microsoft.Web.Infrastructure.1.0.”添加到“packages.config”
已将“Microsoft.Web.Infrastructure 1.0.0.0”成功安装到 ConsoleApplication37
正在将程序包“WebActivatorEx.2.0.”添加到文件夹“c:\users\xchuang\documents\visual studio \Projects\ConsoleApplication37\packages”
已将程序包“WebActivatorEx.2.0.”添加到文件夹“c:\users\xchuang\documents\visual studio \Projects\ConsoleApplication37\packages”
已将程序包“WebActivatorEx.2.0.”添加到“packages.config”
已将“WebActivatorEx 2.0.”成功安装到 ConsoleApplication37
正在将程序包“EntityFrameworkProfiler.3.0.”添加到文件夹“c:\users\xchuang\documents\visual studio \Projects\ConsoleApplication37\packages”
已将程序包“EntityFrameworkProfiler.3.0.”添加到文件夹“c:\users\xchuang\documents\visual studio \Projects\ConsoleApplication37\packages”
已将程序包“EntityFrameworkProfiler.3.0.”添加到“packages.config”
正在执行脚本文件“c:\users\xchuang\documents\visual studio \Projects\ConsoleApplication37\packages\EntityFrameworkProfiler.3.0.3103.0\tools\Install.ps1”
已将“EntityFrameworkProfiler 3.0.3103.0”成功安装到 ConsoleApplication37
PM>
下载完之后,再看一下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.Students
from m in dbContext.StudentAddresses
where n.StudentID == m.StudentID
group n.StudentID by n.StudentName into g
select new { g.Key, count = g.Count() }).ToList(); dbContext.SaveChanges();
}
}
}
然后执行一下,看看efprofile监视到db中是如何生成query plan的快照的。。。

好了,三种方式基本上就是这样了,现在的您是不是会监视自己ef中的sql流转了呢?
监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile的更多相关文章
- jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画
地狱的镰刀 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){ ...
- JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画
bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...
- Struts2中jsp前台传值到action后台的三种方式以及valueStack的使用
struts2中的Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: <form action="login" method="pos ...
- Delphi 操作SQL 插入一万条数据 三种方式速度测试
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Android中WebView的JavaScript代码和本地代码交互的三种方式
一.Android中WebView的漏洞分析最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...
- EntityFramework中使用sql语句
https://blog.csdn.net/yangyangafan/article/details/77602133 EntityFramework操作数据库谜一般的方便还不用写数据库,但前提是很简 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- C#批量插入数据到Sqlserver中的三种方式
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
随机推荐
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- 使用CSS3实现一个3D相册
CSS3系列我已经写过两篇文章,感兴趣的同学可以先看一下CSS3初体验之奇技淫巧,CSS3 3D立方体效果-transform也不过如此 第一篇主要列出了一些常用或经典的CSS3技巧和方法:第二篇是一 ...
- logstash file输入,无输出原因与解决办法
1.现象 很多同学在用logstash input 为file的时候,经常会出现如下问题:配置文件无误,logstash有时一直停留在等待输入的界面 2.解释 logstash作为日志分析的管道,在实 ...
- Android探索之AIDL实现进程间通信
前言: 前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?Android系统中的进程之间不能共享内存,因此,需要提供 ...
- 微框架spark--api开发利器
spark简介 Spark(注意不要同Apache Spark混淆)的设计初衷是,可以简单容易地创建REST API或Web应用程序.它是一个灵活.简洁的框架,大小只有1MB.Spark允许用户自己选 ...
- 步入angularjs directive(指令)--点击按钮加入loading状态
今天我终于鼓起勇气写自己的博客了,激动与害怕并存,希望大家能多多批评指导,如果能够帮助大家,也希望大家点个赞!! 用angularjs 工作也有段时间了,总体感觉最有挑战性的还是指令,因为没有指令的a ...
- jsp页面无法识别el表达式的解决方案
今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...
- webstorm下载&&安装过程&&打开项目
一.webstorm下载 WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为"Web前端开发神器"."最强大的HT ...
- 现代3D图形编程学习-基础简介(3)-什么是opengl (译)
本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...
- Unity3D 5.3 新版AssetBundle使用方案及策略
1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...