9

我可以看到由Entity Framework爲Visual Studio中的選擇操作生成的SQL,但不能用於插入,更新和刪除。如何在調試時看到在Visual Studio中爲「DataContext.SaveChanges」命令生成的SQL?在Visual Studio中查看爲Entity Framewok SaveChanges命令生成的SQL?

+0

猜測你沒有完整版本的SqlServer – Will 2012-03-02 15:34:11

+0

可能重複[如何查看由實體框架生成的SQL?](http://stackoverflow.com/questions/1412863/how-do-i -view-the-sql-generated-the-the-entity-framework) – jrummell 2012-03-02 15:34:38

+0

我正在使用完整版本的SQL服務器,但我沒有權限使用SQL Server分析器。但我可以在Visual Studio中看到選擇的sql,但沒有更新。爲什麼?我看到投票結束這篇文章,因爲我想知道是否有替代解決方案的SQL服務器分析器。 – RKP 2012-03-02 15:42:46

回答

2

看一看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(); 
     } 
    } 
} 
3

這裏是很簡單的東西,我發現:

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

請參閱:Entity Framework日誌記錄和攔截數據庫操作(EF6起):https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – DeveloperDan 2017-09-21 19:14:41

-2

我知道這是舊的,但它是在我的搜索想出了第一個鏈接所以我想我會張貼對我來說最簡單的解決方案是使用SQL事件探查器每次:

String or binary data would be truncated.The statement has been terminated

噢...剛纔看到OP沒有進入探查,但鏈接仍然是很好的得到安寧g爲那些做的指示!

+0

您可以將此添加爲評論但答案應直接嘗試解決OP的問題 – techspider 2016-06-01 19:12:56

相關問題