È 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?
risposta
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.
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();
}
}
}
Ecco qualcosa di veramente semplice che ho trovato:
context.Database.Log = x => System.Diagnostics.Debug.WriteLine(x);
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
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!
È possibile aggiungere questo come un commento ma una risposta dovrebbe tentare direttamente di risolvere le domande dell'OP – techspider
- 1. LINQ to entità AcceptAllChanges SaveChanges
- 2. Codice Entità Framewok Primo "Provider ADO.NET non trovato" con DLL SQL Server CE locali
- 3. Comando/plug-in "Esegui/Debug in X" per Visual Studio
- 4. Comando per selezione blocco in Visual Studio 2008
- 5. Formato script SQL in Visual Studio 2012
- 6. Come si creano diagrammi di entità in Visual Studio?
- 7. Entity Framework l'ordine sql generato da Savechanges()
- 8. Il comando di Visual Studio "Pubblica" non riesce
- 9. Visual Studio: apre un file SQL con SQL Management Studio in una finestra SSMS esistente?
- 10. comando eventi post-generazione per la pubblicazione (Visual Studio 2010)
- 11. Il pulsante Visual Studio 2013 per aggiungere una vista è disabilitato
- 12. Visual Studio 2010 SQL variabile colori
- 13. Il cursore scompare in Visual Studio 2015
- 14. Configurazione di Visual Studio per file .sql PostgreSQL
- 15. SQL Server Management Studio viene fornito con Visual Studio?
- 16. Visual Studio e SQL Server Management Studio - Your Pick
- 17. Il modello di entità ADO.net di Visual Studio 2013 non dispone dell'origine dati Oracle
- 18. Trova dove è stata originariamente generata l'eccezione di rethrown utilizzando il debugger di Visual Studio C#?
- 19. È possibile aggiungere file in una cartella della soluzione generata da CMake in Visual Studio?
- 20. Ottieni Visual Studio per utilizzare il sottodominio?
- 21. Entità di marshalling generata NPE in JAX-RS
- 22. C# per scrivere macro in Visual Studio?
- 23. minima Visual Studio versione per Visual Studio 2015 soluzione
- 24. linq alle entità generate sql
- 25. EF Competing SaveChanges() Chiamate
- 26. Perché SQL Server Object Explorer in Visual Studio è lento?
- 27. Aggiunta di intestazioni SOAP per il servizio Web SQL Endpoint HTTP 2005 in Visual Studio 2008
- 28. Vista elenco WPF rimuovere colonna aggiuntiva generata
- 29. Aumento del timeout di comando per il comando SQL
- 30. Tema di Visual Studio 2010 per Visual Studio 2012?
Supporre che non si disponga della versione completa di SqlServer – Will
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
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