我可以看到由Entity Framework爲Visual Studio中的選擇操作生成的SQL,但不能用於插入,更新和刪除。如何在調試時看到在Visual Studio中爲「DataContext.SaveChanges」命令生成的SQL?在Visual Studio中查看爲Entity Framewok SaveChanges命令生成的SQL?
回答
如果你有visual studio的終極版,你可以在intellitrace中看到更新和插入。只需在調用SaveChanges之後放置一個斷點。
http://www.youtube.com/watch?v=fLBpZNXs-Lw
如果您使用的是它在Web項目你也可以使用微型分析器。
看一看this thread在MSDN論壇上;具體而言,由g_yordanov發佈。他提供了一些代碼,可以檢索EF數據上下文中所有更改的相應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();
}
}
}
這裏是很簡單的東西,我發現:
context.Database.Log = x => System.Diagnostics.Debug.WriteLine(x);
請參閱:Entity Framework日誌記錄和攔截數據庫操作(EF6起):https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – DeveloperDan 2017-09-21 19:14:41
我知道這是舊的,但它是在我的搜索想出了第一個鏈接所以我想我會張貼對我來說最簡單的解決方案是使用SQL事件探查器每次:
String or binary data would be truncated.The statement has been terminated
噢...剛纔看到OP沒有進入探查,但鏈接仍然是很好的得到安寧g爲那些做的指示!
您可以將此添加爲評論但答案應直接嘗試解決OP的問題 – techspider 2016-06-01 19:12:56
- 1. Visual Studio命令行生成參數
- 2. Visual Studio 2012命令行生成
- 3. Entity Framework4,查看生成的查詢?
- 4. 在Visual Studio中查看進程命令行參數
- 5. 如何在Visual Studio代碼中查看JSCode生成的文檔?
- 6. 從命令行在2017 Visual Studio中生成項目?
- 7. 命令行中的Visual Studio會生成警告; IDE不是
- 8. Visual Studio命令
- 9. 如何在Xamarin Studio中查看由SQLite.NET PCL生成的SQL?
- 10. 命令行中的Visual Studio
- 11. 在Visual Studio中查看Visual SourceSafe日誌
- 12. 在Webmatrix 2中安裝Entity Framewok v5 RC
- 13. SQL命令生成器查詢值
- 14. Entity-Framework SQL命令超時
- 15. 生成後事件命令發佈(Visual Studio 2010中)
- 16. Visual Studio中後生成事件MT.exe命令失敗,代碼9009
- 17. 在visual studio中爲c sharp生成form_Closing
- 18. SaveChanges查詢生成性能
- 19. 在SQL查詢生成器中使用變量Visual Studio
- 20. 查看Automapper生成的sql
- 21. 如何查看使用Oracle數據庫時由Entity Framework生成的SQL?
- 22. Powershell命令在Visual Studio中的生成事件中不起作用
- 23. 如何在Visual Studio中的預生成事件中使用此命令
- 24. Visual Studio團隊資源管理器 - 查看Git命令
- 25. 在Visual Studio中查看動態代碼
- 26. 查看生成的SQL語句的LLBLGen
- 27. Visual Studio 2012不生成命名空間
- 28. 將變量發送到Visual Studio 2008生成事件命令行
- 29. 如何將命令行代碼生成器添加到Visual Studio?
- 30. 如何在調試期間查看由Visual Studio 2008中的LINQ-to-SQL生成的實際SQL表達式?
猜測你沒有完整版本的SqlServer – Will 2012-03-02 15:34:11
可能重複[如何查看由實體框架生成的SQL?](http://stackoverflow.com/questions/1412863/how-do-i -view-the-sql-generated-the-the-entity-framework) – jrummell 2012-03-02 15:34:38
我正在使用完整版本的SQL服務器,但我沒有權限使用SQL Server分析器。但我可以在Visual Studio中看到選擇的sql,但沒有更新。爲什麼?我看到投票結束這篇文章,因爲我想知道是否有替代解決方案的SQL服務器分析器。 – RKP 2012-03-02 15:42:46