powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перехват sql запроса, который генерится Entity Framework
4 сообщений из 4, страница 1 из 1
Перехват sql запроса, который генерится Entity Framework
    #36275356
cha0ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, а кто-нить знает как можно перехватить sql-запрос, который генерирует Entity Framework?

Т.е допустим вызываем метод SaveChanges(), у нас EF генерит sql запрос и запускает его для нашей БД. Необходимо, чтобы EF ничего не предпринимала в БД, а лишь выдала запрос, который намеревалась сделать =)

Если уже кто-нибудь пробовал так извращаться над Entity, выложите плиз код =)
...
Рейтинг: 0 / 0
Перехват sql запроса, который генерится Entity Framework
    #36275583
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SaveChanges(false)
вот как sql-код вывести не в курсе. Возможно что и никак.
...
Рейтинг: 0 / 0
Перехват sql запроса, который генерится Entity Framework
    #36276403
cha0ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ссылку =) На этом же сайте нашел статейку про валидацию данных перед сохранением . Через ObjectStateManager оказалось можно выдернуть все объекты, которые были подвержены изменениям (удаление, обновление, удаление), но пока не нашел как выдернуть sql запрос на совершение этих изменений.

Далее с другой стороны нашел, как можно выдернуть sql-запрос из linq-запроса. Получилось что-то типа:
var org = from c in EF.zakazhik
where c.OID == "000000000200"
select new
{
Orgs = c.Org,
c.OID
};

ObjectQuery oq = (ObjectQuery)org; //Предварительно подключаем System.Data.Objects

Жалко, что все это еще не решает моей проблемы ( нужно выдирать sql-запрос на любые изменения в базе...
...
Рейтинг: 0 / 0
Перехват sql запроса, который генерится Entity Framework
    #36276804
cha0ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хех, представляете оказывается это возможно. Вычитал в обсуждении на http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/2a50ffd2-ed73-411d-82bc-c9c564623cb4/

Дополнительный класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
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();
        }
    }
}

Перед сохранением CustomExtensions.ToTraceString(<ваш контекст>) будет выдавать итоговый sql-запрос
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перехват sql запроса, который генерится Entity Framework
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]