Visual studio 2010 在Visual studio中查看实体Framewok SaveChanges命令生成的SQL?
我可以在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应用程序中都能完美地工作 这是代码,仅供参考,以防链接消失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论坛
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的替代解决方案。该链接不涉及更新。仅可选择您可以将其添加为注释,但答案应直接尝试