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

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. 机器学习(Machine Learning)&深度学习(Deep Learning)资料

    <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...

  2. 日本超人气洛比(Robi)声控机器人

    1.日本超人气洛比(Robi)声控机器人. http://technews.cn/2015/04/18/interview-with-robi-creator-tomotaka-takahashi/ ...

  3. Eclipse+Selenium自动化测试脚本设计V1.0

    Eclipse+Selenium自动化测试脚本设计V1.0 http://www.docin.com/p-803032251.html

  4. android中的提示信息显示方法(toast应用)

    android中的提示信息显示方法(toast应用) (2011-10-17 11:02:06) 转载▼ 标签: android toast 杂谈 分类: Android android中toast的 ...

  5. Linux探秘之I/O效率

    一.文章来由 最近看了<UNIX环境高级编程>,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对read.write.fread ...

  6. caffe上使用hdf5格式文件以及回归(regression)问题

    最近用caffe做了一下regression问题,先用data layer中的data,float_data试了一下,data用来存放图片,float_data存放regression的values, ...

  7. Android对话框之Context

    代码就这么一段: new AlertDialog.Builder(getApplicationContext(),R.style.MyAlertDialogStyle) .setTitle(" ...

  8. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)

    译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...

  9. toad 常用快捷键与配置

    F8 调出以前执行的sql命令 F9 执行全部sql Ctrl+. 补全table_name Ctrl+t 补全table_name,或者显示字段 alt+ 箭头上下 看sql history Ctr ...

  10. Python Django 开发 4 ORM

    第三篇最后写了,光知道那些基础的查询在项目中是没有什么卵用的,重点是实体关系映射(ORM),今天学习了,来记录一下,关键词:ForeignKey(多对一).OneToOneField(一对一).Man ...