Visual studio 2010 在Visual studio中查看实体Framewok SaveChanges命令生成的SQL?

Visual studio 2010 在Visual studio中查看实体Framewok SaveChanges命令生成的SQL?,visual-studio-2010,entity-framework,linq-to-entities,entity-framework-4.1,Visual Studio 2010,Entity Framework,Linq To Entities,Entity Framework 4.1,我可以在VisualStudio中看到实体框架为select操作生成的SQL,但不能看到insert、update和delete操作生成的SQL。调试时如何在Visual studio中查看为“DataContext.SaveChanges”命令生成的SQL?如果使用Visual studio ultimate,则可以在intellitrace中查看更新和插入。只需在调用SaveChanges之后放置一个断点 如果您在web项目上使用它,您也可以使用mini profiler 看看MSDN论坛

我可以在VisualStudio中看到实体框架为select操作生成的SQL,但不能看到insert、update和delete操作生成的SQL。调试时如何在Visual studio中查看为“DataContext.SaveChanges”命令生成的SQL?

如果使用Visual studio ultimate,则可以在intellitrace中查看更新和插入。只需在调用SaveChanges之后放置一个断点

如果您在web项目上使用它,您也可以使用mini profiler

看看MSDN论坛;具体地说,这篇文章由g_yordanov撰写。他提供了一些代码,可以为EF datacontext中的所有更改检索相应的SQL语句

作为免责声明,此代码涉及对EF内部的反思,并可能在未来版本中中断。但就目前而言,它在我们所有的EF应用程序中都能完美地工作

这是代码,仅供参考,以防链接消失

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data.Objects;
using System.Data.Common;
using System.Data.EntityClient;
using System.Collections;

namespace EntityExtensionMethods
{
    public static class CustomExtensions
    {
        private static readonly string entityAssemblyName =
            "system.data.entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";

        public static string ToTraceString(this IQueryable query)
        {
            System.Reflection.MethodInfo toTraceStringMethod = query.GetType().GetMethod("ToTraceString");

            if (toTraceStringMethod != null)
                return toTraceStringMethod.Invoke(query, null).ToString();
            else
                return "";
        }

        public static string ToTraceString(this ObjectContext ctx)
        {
            Assembly entityAssemly = Assembly.Load(entityAssemblyName);

            Type updateTranslatorType = entityAssemly.GetType(
                "System.Data.Mapping.Update.Internal.UpdateTranslator");

            Type functionUpdateCommandType = entityAssemly.GetType(
                "System.Data.Mapping.Update.Internal.FunctionUpdateCommand");

            Type dynamicUpdateCommandType = entityAssemly.GetType(
                "System.Data.Mapping.Update.Internal.DynamicUpdateCommand");

            object[] ctorParams = new object[]
                        {
                            ctx.ObjectStateManager,
                            ((EntityConnection)ctx.Connection).GetMetadataWorkspace(),
                            (EntityConnection)ctx.Connection,
                            ctx.CommandTimeout
                        };

            object updateTranslator = Activator.CreateInstance(updateTranslatorType,
                BindingFlags.NonPublic | BindingFlags.Instance, null, ctorParams, null);

            MethodInfo produceCommandsMethod = updateTranslatorType
                .GetMethod("ProduceCommands", BindingFlags.Instance | BindingFlags.NonPublic);
            object updateCommands = produceCommandsMethod.Invoke(updateTranslator, null);

            List<DbCommand> dbCommands = new List<DbCommand>();

            foreach (object o in (IEnumerable)updateCommands)
            {
                if (functionUpdateCommandType.IsInstanceOfType(o))
                {
                    FieldInfo m_dbCommandField = functionUpdateCommandType.GetField(
                        "m_dbCommand", BindingFlags.Instance | BindingFlags.NonPublic);

                    dbCommands.Add((DbCommand)m_dbCommandField.GetValue(o));
                }
                else if (dynamicUpdateCommandType.IsInstanceOfType(o))
                {
                    MethodInfo createCommandMethod = dynamicUpdateCommandType.GetMethod(
                        "CreateCommand", BindingFlags.Instance | BindingFlags.NonPublic);

                    object[] methodParams = new object[]
                    {
                        updateTranslator,
                        new Dictionary<long, object>()
                    };

                    dbCommands.Add((DbCommand)createCommandMethod.Invoke(o, methodParams));
                }
                else
                {
                    throw new NotSupportedException("Unknown UpdateCommand Kind");
                }
            }


            StringBuilder traceString = new StringBuilder();
            foreach (DbCommand command in dbCommands)
            {
                traceString.AppendLine("=============== BEGIN COMMAND ===============");
                traceString.AppendLine();

                traceString.AppendLine(command.CommandText);
                foreach (DbParameter param in command.Parameters)
                {
                    traceString.AppendFormat("{0} = {1}", param.ParameterName, param.Value);
                    traceString.AppendLine();
                }

                traceString.AppendLine();
                traceString.AppendLine("=============== END COMMAND ===============");
            }

            return traceString.ToString();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
运用系统反思;
使用System.Data.Object;
使用System.Data.Common;
使用System.Data.EntityClient;
使用系统集合;
命名空间EntityExtensionMethods
{
公共静态类自定义扩展
{
私有静态只读字符串entityAssemblyName=
“system.data.entity,版本=3.5.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089”;
公共静态字符串ToTraceString(此IQueryable查询)
{
System.Reflection.MethodInfo toTraceStringMethod=query.GetType().GetMethod(“ToTraceString”);
if(toTraceStringMethod!=null)
返回toTraceStringMethod.Invoke(查询,null).ToString();
其他的
返回“”;
}
公共静态字符串ToTraceString(此ObjectContext ctx)
{
Assembly EntityAssembly=Assembly.Load(entityAssemblyName);
类型updateTranslatorType=entityAssemly.GetType(
“System.Data.Mapping.Update.Internal.UpdateTranslator”);
类型functionUpdateCommandType=entityAssemly.GetType(
“System.Data.Mapping.Update.Internal.FunctionUpdateCommand”);
类型dynamicUpdateCommandType=entityAssemly.GetType(
“System.Data.Mapping.Update.Internal.DynamicUpdateCommand”);
对象[]参数=新对象[]
{
ctx.ObjectStateManager,
((EntityConnection)ctx.Connection).GetMetadataWorkspace(),
(实体连接)ctx.Connection,
ctx.CommandTimeout
};
对象updateTranslator=Activator.CreateInstance(updateTranslatorType,
BindingFlags.NonPublic | BindingFlags.Instance,null,ctorParams,null);
MethodInfo produceCommandsMethod=updateTranslatorType
.GetMethod(“ProduceCommands”,BindingFlags.Instance | BindingFlags.NonPublic);
对象updateCommand=produceCommandsMethod.Invoke(updateTranslator,null);
List dbCommands=new List();
foreach(对象o在(IEnumerable)updateCommand中)
{
if(functionUpdateCommand.IsInstanceOfType(o))
{
FieldInfo m_dbCommandField=函数UpdateCommandType.GetField(
“m|dbCommand”,BindingFlags.Instance | BindingFlags.NonPublic);
Add((DbCommand)m_dbCommandField.GetValue(o));
}
else if(dynamicUpdateCommandType.IsInstanceOfType(o))
{
MethodInfo createCommandMethod=DynamicCupDateCommandType.GetMethod(
“CreateCommand”,BindingFlags.Instance | BindingFlags.NonPublic);
对象[]方法参数=新对象[]
{
更新转换器,
新字典()
};
添加((DbCommand)createCommandMethod.Invoke(o,methodParams));
}
其他的
{
抛出新的NotSupportedException(“未知更新命令类型”);
}
}
StringBuilder traceString=新建StringBuilder();
foreach(dbCommands中的DbCommand命令)
{
traceString.AppendLine(“=========================================================================”);
traceString.AppendLine();
AppendLine(command.CommandText);
foreach(command.Parameters中的DbParameter参数)
{
AppendFormat(“{0}={1}”,param.ParameterName,param.Value);
traceString.AppendLine();
}
traceString.AppendLine();
traceString.AppendLine(“======================================================================”);
}
返回traceString.ToString();
}
}
}

我发现了一些非常简单的东西:

context.Database.Log = x => System.Diagnostics.Debug.WriteLine(x);

我知道这很古老,但这是我搜索中出现的第一个链接,所以我想我应该发布一篇文章,对我来说最简单的解决方案是使用SQL Profiler per:


Ooops…刚才看到OP没有访问Profiler的权限,但是该链接仍然可以为那些访问Profiler的人提供指导

猜测您没有SQL server的完整版本可能与的重复我正在使用SQL server的完整版本,但我没有使用SQL server profiler的权限。但是我可以在VisualStudio中看到用于选择的sql,但不能看到更新。为什么?我看到有人投票支持结束这篇文章,因为我想知道是否有SQL server profiler的替代解决方案。该链接不涉及更新。仅可选择您可以将其添加为注释,但答案应直接尝试