9

È possibile visualizzare l'SQL generato da Entity Framework per operazioni selezionate in Visual Studio, ma non per inserimento, aggiornamento ed eliminazione. come posso vedere l'SQL generato per il comando "DataContext.SaveChanges" in Visual Studio durante il debug?vista generata SQL per il comando Entità Framewok SaveChanges in Visual Studio?

+0

Supporre che non si disponga della versione completa di SqlServer – Will

+0

possibile duplicato di [Come visualizzare l'SQL generato dal framework entità?] (Http://stackoverflow.com/questions/1412863/how-do-i -view-the-sql-generate-by-the-entity-framework) – jrummell

+0

Sto usando la versione completa del server SQL, ma non ho le autorizzazioni per utilizzare il profiler di SQL Server. ma posso vedere lo sql per selezionare in Visual Studio, ma non gli aggiornamenti. perché? Vedo un voto per la chiusura di questo post, perché vorrei sapere se esiste una soluzione alternativa per SQL Server Profiler. – RKP

risposta

5

Se si dispone di Visual Studio Ultimate, è possibile visualizzare gli aggiornamenti e gli inserimenti in Intellitrace. Basta inserire un breakpoint subito dopo la chiamata a SaveChanges.

http://www.youtube.com/watch?v=fLBpZNXs-Lw

Se lo si utilizza su un progetto web che si potrebbe anche usare mini-profiler.

http://miniprofiler.com/

2

Dai un'occhiata alla this thread sui forum MSDN; nello specifico, il post di g_yordanov. Ha fornito un codice che può recuperare le istruzioni SQL corrispondenti per tutte le modifiche in un datacontext EF.

Come clausola di esclusione della responsabilità, questo codice riguarda la riflessione sugli interni di EF e potrebbe rompersi nelle versioni future. Ma per ora funziona in modo impeccabile in tutte le nostre app EF.

Ecco il codice, per riferimento, nel caso in cui il collegamento scompaia.

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

Ecco qualcosa di veramente semplice che ho trovato:

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

Vedere: Entity Framework Registrazione e intercettazione delle operazioni di database (EF6 in poi) qui: https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – DeveloperDan

-2

So che questo è vecchio, ma è stato il primo link che è venuto nella mia ricerca in modo che avevo pensato che avrei posto che la soluzione più semplice per me è stato quello di utilizzare SQL Profiler per:

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

Ops ... appena visto che OP non ha accesso al Profiler, ma il collegamento è ancora buono per GIVIN istruzioni per coloro che lo fanno!

+0

È possibile aggiungere questo come un commento ma una risposta dovrebbe tentare direttamente di risolvere le domande dell'OP – techspider

Problemi correlati