ADO.NET Entity Framework深入分析, Part 4

Entity Data Model 是一个概念模型,所有Entity SQL和LINQ to Entities 查询将最终转化为T-SQL的脚本,从数据库中查询数据。这里演示了几种方法来查看生成的T-SQL,有助于Debug或分析问题。

1.使用SQL Server Profiler 工具

与LINQ to SQL比较而言,ObjectContext 类没有提供Log属性或者通用的log机制,因此,无法在Visual Studio 中跟踪所有的T-SQL语句。

如果你想查看所有执行的T-SQL语句,你需要使用SQL Server的Profiler 工具,关于具体如何使用SQL Server Profiler工具,请参考如下文章:

SQL Profiler: Features, functions and setup in SQL Server 2005

http://blog.entlib.com/EntLib/archive/2008/10/27/sql-profiler-features-functions-and-setup-in-sql-server-2005.aspx

2.ToTraceString 方法

另外一种方法去查看生成的T-SQL语句的方法,包括 EntityCommand和ObjectQuery类都有一个ToTraceString() 方法。在一些情况下,可以用来查看内部到底生成什么SQL脚本,而不必一定要使用SQL Server Profiler 工具。需要注意的是:ToTraceString() 方法实际上没有执行查询操作,仅仅是转化查询为SQL脚本。

通过增加一个断点,你可以轻松查看SQL脚本,需要记住的是:事先需要打开数据库连接,否则会抛出InvalidOperationException 异常(Execution of the command requires an open and available connection.The connection’s current state is closed.)

(1)Entity SQL : EntityCommand.ToTraceString() 示例脚本

public IList<Category> GetParentCategory()
        {
            IList<Category> result = null;
            EntityDataReader rdr;
            EntityCommand cmd;
            string esqlQuery;

            using (EntityConnection conn = new EntityConnection("name=AdventureWorksLTEntities"))
            {
                conn.Open();
                esqlQuery = @"Select VALUE c from AdventureWorksLTEntities.Category AS c
                    Where c.ParentCategory is null ";
                result = new List<Category>();

                cmd = conn.CreateCommand();
                cmd.CommandText = esqlQuery;

                Console.WriteLine(cmd.CommandText);
                Console.WriteLine(cmd.ToTraceString());

                rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);

                while (rdr.Read())
                {
                    result.Add(this.productGateway.MaterializeCategory(rdr));
                }

                conn.Close();
            }

            return result;
        }

时间: 2024-10-18 06:58:27

ADO.NET Entity Framework深入分析, Part 4的相关文章

ADO.NET Entity Framework深入分析, Part 7 – Change Tracking

ObjectStateManager – 对象状态管理器 我们已经知道如何增加.更新和删除实体记录,并将更改数据库记录.Entity Framework 通过Object Context 控制的ObjectStateManager 对象来跟踪变更,ObjectStateManager 将跟踪所有对实体对象的变更,在调用SaveChanges() 方法时,执行相应的T-SQL脚本. ObjectStateManager比LINQ to SQL中DataContext 的变更跟踪功能更先进.下面,我

ADO.NET Entity Framework深入分析,Part 6–处理并发(Concurrency Handling)

设置并发模式 Entity Framework 实现了乐观的并发模式(Optimistic Concurrency Model).默认情况下,在实体更新数据提交到数据库时,并不会检查并发.对于高频率的并发属性,你需要设置属性的并发模式为Fixed. 这些属性将会加入到T-SQL脚本的WHERE子句部分,用来比较客户端的值和数据库端的值. 示例代码: public void UpdateProduct() { Product product = context.Product.FirstOrDef

ADO.NET Entity Framework深入分析, Part 5

前面的Part 1-4的文章,介绍了Entity Data Model.Entity SQL.ObjectQuery.EntityCommand.LINQ to Entities等等及其代码演示.Part 4主要演示如何通过相关技术或Debug工具,如SQL Server Profiler.ToTraceString 方法.eSqlBlast 工具.LINQPad工具等等,来查看生成的T-SQL脚本.本篇文章Part 5 演示如何新增.更新和删除数据实体,并相应更新数据库. 增加.更新和删除实体

ADO.NET Entity Framework(1)介绍

目录 1 概念 1 2 ADO.NET Entity Framework 2 2.1 架构 2 2.2 说明 2 2.3 EntityConnection 4 2.4 EntityCommand 5 2.5 通过EntityDataReader 方式的数据访问 6 2.6 通过ObjectContext返回ObjectQuery<T> 方式的数据访问 9 概念 LINQ to Entities 一种 LINQ 技术,使开发人员可以使用 LINQ 表达式和 LINQ 标准查询运算符,针对实体数据

ado.net entity framework查询性能比较

关于ado.net entity framework 性能比较网上也有很多,这里我只是初步的 介绍下ado.net entity framework使用不同的方法查询数据的不同性能 第一部分:重复查询单个实体 第一种:Linq To Entitiess 代码如下: static void Main(string[] args) { DateTime time1; DateTime time2; time1 = DateTime.Now; NorthwindEntities context = n

在ADO.NET Entity Framework 4中使用枚举

枚举(Enum)是一种常用的类型,如用于表示状态.类型等参数.但目前它不 会被官方地在ADO.NET Entity Framework中进行支持.本文介绍的是通过复杂类 型(Complex Types)在ADO.NET Entity Framework 4中使用枚举. 这种方法需要使用POCO类,而不能使用Visual Studio自动生成的类.因为我 们需要手动为复杂类型编写代码. 数据库脚本: 1 if exists (select 1 2 from sysobjects 3 where i

ADO.NET Entity Framework 4中枚举的使用

  本文将通过ADO.NET Entity Framework 4中枚举的使用介绍,带领大家走进ADO.NET的世界. 枚举(Enum)是一种常用的类型,如用于表示状态.类型等参数.但目前它不会被官方地在ADO.NET Entity Framework中进行支持.本文介绍的是通过复杂类型(Complex Types)在ADO.NET Entity Framework 4中使用枚举. 这种方法需要使用POCO类,而不能使用Visual Studio自动生成的类.因为我们需要手动为复杂类型编写代码.

自定义Unity对象生命周期管理集成ADO.NET Entity Framework

在Unity中,从Unity 取得的实例为 Transient.如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一个了.在Unity IOC中,它支持我们对于组件的实例进行控制,也就是说我们可以透明的管理一个组件拥有多少个实例.Unity IOC容器提供了如下几种生命处理方式:# Singleton:一个组件只有一个实例被创建,所有请求的客户使用程序得到的都是同一个实例.# Transient:这种处理方式与我们平时使用new的效果是一样的,对于每次

Microsoft SQL Server Compact 4.0&amp;&amp;ADO.NET Entity Framework 4.1&amp;&amp;MVC3

原文:Microsoft SQL Server Compact 4.0&&ADO.NET Entity Framework 4.1&&MVC3 最近重新查看微软MvcMusicStore-v3.0的源代码,发现忽略了很多重要的东西,特别是数据访问那一部分. 首先Microsoft SQL Server Compact 4.0 详细的介绍和下载地址 链接:http://www.microsoft.com/zh-cn/download/details.aspx?id=17876