просмотреть сгенерированный SQL для команды Entity Framewok SaveChanges в Visual studio? - PullRequest
9 голосов
/ 02 марта 2012

Я вижу SQL, сгенерированный Entity Framework для операций выбора в Visual Studio, но не для вставки, обновления и удаления. Как увидеть SQL, сгенерированный для команды «DataContext.SaveChanges» в Visual Studio во время отладки?

Ответы [ 4 ]

5 голосов
/ 13 мая 2012

Если у вас есть Visual Studio Ultimate, вы можете увидеть обновления и вставки в Intellitrace.Просто установите точку останова сразу после вызова SaveChanges.

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

Если вы используете ее в веб-проекте, вы также можете использовать мини-профилировщик.

http://miniprofiler.com/

3 голосов
/ 03 ноября 2015

Вот что-то действительно простое, что я нашел:

context.Database.Log = x => System.Diagnostics.Debug.WriteLine(x);
2 голосов
/ 13 мая 2012

Посмотрите на эту ветку на форумах MSDN; конкретно пост от г_йорданов. Он предоставил некоторый код, который может извлечь соответствующие операторы SQL для всех изменений в текстовом тексте EF.

Как заявление об отказе от ответственности, этот код включает в себя размышления о внутренностях 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();
        }
    }
}
0 голосов
/ 01 июня 2016

Я знаю, что он старый, но это была первая ссылка, которая появилась в моем поиске, поэтому я подумал, что опубликую, что самым простым решением для меня было использование SQL Profiler для:

Строковые или двоичные данные будут усечены. Оператор завершен

Упс ... только что увидел, что у ОП нет доступа к Профилировщику, но ссылка все еще хороша для предоставления инструкций тем, кто это делает!

...