网上这方面的资料很少,找到一个可以用的

http://code.msdn.microsoft.com/EFProviderWrappers

里面有dll可以下载,有教程,不过是E文的。

在Entity Framework中要查看到底最终转译的SQL command是甚麼相当困难,因為EF本身并没有提供像Linq2sql的Log属性来达成此点,这可能是因為Linq2sql比较单纯只对SQL Server,而EF在设计上是与资料库无关.

目前Entity Framework只能透过ObjectQuery的ToTraceString()来输出转译后的查询SQL语法.但对於SaveChange这类新增修改没有方式能够输出到底实际上的SQL command是甚麼.

以往要追踪的方式大概就是从SQL Profiler这类资料库附加的软体於资料库端追踪输出,但因為资料库通常不太可能单单只有一隻程式使用,在追踪上有点麻烦.

还好有人找出了解决之道并实作Library提供给大家使用.专案参考http://code.msdn.microsoft.com/EFProviderWrappers

他的做法是从EntityConnection着手,底下图的左边是原来的EF架构,而右边则使此Library的做法,中间多了一层Wrapping Provider.

再来介绍该如何使用此Library

1.请先至网站下载档案,因為下载下来為SourceCode所以请先用VS编译过.

2.编译后寻找EFTracingProvider目录底下的bindebug有两个dll,EFProviderWrapperToolkit.dll与EFTracingProvider.dll.

3.将这两个dll复製到你想要的目录.

4.开啟EF专案,使用加入参考方式加入此二个dll.

5.再来就是如何掛载Wrapping Provider,预设情况用EDM tool desinger设计好模型后,在VS中会產生.edmx与.designer.cs档案,而.designer.cs中会產生对应的ObjectContext class, 而ObjectContext class则是使用EDM tool desinger时所输入的名称,预设会是xxxEntities.

而掛载方式就是继承此class修改其建构式,譬如底下的范例是使用EDM建立一个TestEntities的ObjectContext. 新增一个class档案,命名為ExtendedTestEntities.cs修改如下,

    public partial class ExtendedTestEntities : TestEntities
    {
        private TextWriter logOutput;
 
        public ExtendedTestEntities()
            : this("name=TestEntities")
        {
        }
 
        public ExtendedTestEntities(string connectionString)
            : base(EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(
                    connectionString,
                    "EFTracingProvider"
            ))
        {
        }
 
        #region Tracing Extensions
 
        private EFTracingConnection TracingConnection
        {
            get { return this.UnwrapConnection<EFTracingConnection>(); }
        }
 
        public event EventHandler<CommandExecutionEventArgs> CommandExecuting
        {
            add { this.TracingConnection.CommandExecuting += value; }
            remove { this.TracingConnection.CommandExecuting -= value; }
        }
 
        public event EventHandler<CommandExecutionEventArgs> CommandFinished
        {
            add { this.TracingConnection.CommandFinished += value; }
            remove { this.TracingConnection.CommandFinished -= value; }
        }
 
        public event EventHandler<CommandExecutionEventArgs> CommandFailed
        {
            add { this.TracingConnection.CommandFailed += value; }
            remove { this.TracingConnection.CommandFailed -= value; }
        }
 
        private void AppendToLog(object sender, CommandExecutionEventArgs e)
        {
            if (this.logOutput != null)
            {
                this.logOutput.WriteLine(e.ToTraceString().TrimEnd());
                this.logOutput.WriteLine();
            }
        }
 
        public TextWriter Log
        {
            get { return this.logOutput; }
            set
            {
                if ((this.logOutput != null) != (value != null))
                {
                    if (value == null)
                    {
                        CommandExecuting -= AppendToLog;
                    }
                    else
                    {
                        CommandExecuting += AppendToLog;
                    }
                }
 
                this.logOutput = value;
            }
        }
 
 
        #endregion
    }

以上程式码若要套用於你的程式只要修改TestEntities相关描述即可,剩下的可以直接Copy.

最后在程式中使用方式如下

            EFTracingProviderConfiguration.RegisterProvider();
 
            using (ExtendedTestEntities context = new ExtendedTestEntities())
            {                
                context.CommandExecuting += (sender, e) =>
                {
                    string s = e.ToTraceString();
                };
 
                context.CommandFinished += (sender, e) =>
                {
                    string s = e.ToTraceString();
                };
 
                ...
            }

透过CommandExecuting与CommandFinished事件则可拦截到最后EF下达SQL命令开始执行与执行后,另外还有执行失败的事件,而透过callback函式的参数之ToTraceString()即可取得完整的转译后之SQL command.

这边要注意一点,第一行的EFTracingProviderConfiguration.RegisterProvider();

是用来註册这个Library的Provider,因為这个Library除了Tracer SQL外还提供其他的功能,譬如说 Cache机制,都是透过Wrapping Provider来达成,如要了解可以参考官方网站之说明文件.

而除了在程式中使用,也可透过.net config机制来註册,在相关config中加入如下的描述即可

<system.data>
<DbProviderFactories>
<add name="EF Tracing Data Provider"
invariant="EFTracingProvider"
description="Tracing Provider Wrapper"
type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
<add name="EF Generic Provider Wrapper"
invariant="EFProviderWrapper"
description="Generic Provider Wrapper"
type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
</DbProviderFactories>
</system.data>

ahjesus 捕获entity framework生成的sql语句的更多相关文章

  1. 监听Entity Framework生成的Sql语句

               Entity Framework为我们提供了很大的方便,但有时候,我们想看看EF生成的Sql语句到底是怎样的,一种方式是我们可以启用Sql Server Profer工具.今天介 ...

  2. Entity Framework Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  3. 使用工具追踪Entity Framework生成的SQL

    学习entity framework期间收集的文章,转自http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQuer ...

  4. Entity Framework中执行Sql语句

           如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本).        EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...

  5. Entity Framework执行原生SQL语句

    ExecuteSqlCommand为执行命令的接口, SqlQuery 为返回查询结果 1.Database.ExecuteSqlCommand 方法 (String, Object[]) 对数据库执 ...

  6. Entity framework 生成的SQL如何设置兼容低版本的数据(转载)

    来源:https://q.cnblogs.com/q/84401/ 右键 edmx 文件,有xml方式打开. 将ProviderManifestToken 改为 2008 .

  7. Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题

    在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public ...

  8. Entity Framework Code First+SQL Server,改变聚集索引,提高查询性能

    .net Entity Framework(调研的是Entity Framework 4.0) code first方式生成数据库时,不能修改数据库表的索引,而SQLServer默认会把数据表的主键设 ...

  9. 使用EntityFramework6.1的DbCommandInterceptor拦截生成的SQL语句

    开始 EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以 ...

随机推荐

  1. TDA - Thread Dump Analyzer (Java线程分析工具)

    TDA - Thread Dump Analyzer (Java线程分析工具)http://automationqa.com/forum.php?mod=viewthread&tid=2351 ...

  2. hadoop的dfs工具类一个【原创】

    开始没搞定插件问题,就弄了个dsf操作类,后面搞定了插件问题,这玩意也就聊胜于无了,还是丢这里算了. 首先是一个配置,ztool.hadoop.properties hadoop.home.dir=G ...

  3. Linux多线程编程(不限Linux)【转】

    ——本文一个例子展开,介绍Linux下面线程的操作.多线程的同步和互斥. 前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步 ...

  4. vs.php调试php使用外部的apache进行调试

    vs.php中使用外部的apache进行调试 一般phper们都会有自己配置好的开发调试环境,那么如何在vs.php中使用自己已经配置好的apache+php环境调试 php程序呢?如下: (1)从官 ...

  5. Bulk Insert的用法 .

    /******* 导出到excel */EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:/temp1.xls -c -q -S&quo ...

  6. Windows Storage Server 2008 R2 Standard(64位)之ASM(Automated Storage Manager)管理

    一.服务器管理器之LUN管理 服务器管理器的LUN管理,右键可删除(注意别删了系统分区在的LUN) 二.ASM(Automated Storage Manager) view 高级信息,请不要修改相关 ...

  7. Netty5 + WebSocket 练习

    1. 了解WebSocket知识 略2. websocket实现系统简单反馈时间 WebSocketServerHandler.java package com.jieli.nettytest.web ...

  8. 基于MSP430F413水果电池供电的低功耗时钟

      我最早接触MSP430时候,看到书的第一页就是一张水果电池的图片,一直以来想做一个低功耗的可以水果电池供电的系统,毕业之后的下半年选择MSP430F413单片机来画了一个低功耗的板子,一直没有调试 ...

  9. Asp.Net(C#)自动执行计划任务的程序实例分析

    在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQ ...

  10. MongoDB 基础命令行

    本文专门介绍MongoDB的命令行操作.其实,这些操作在MongoDB官网提供的Quick Reference上都有,但是英文的,为了方便,这里将其稍微整理下,方便查阅. 登录和退出 mongo命令直 ...