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

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

Если уже кто-нибудь пробовал так извращаться над Entity, выложите плиз код =)
...
Рейтинг: 0 / 0
27.10.2009, 19:07
    #36275583
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват sql запроса, который генерится Entity Framework
SaveChanges(false)
вот как sql-код вывести не в курсе. Возможно что и никак.
...
Рейтинг: 0 / 0
28.10.2009, 10:44
    #36276403
cha0ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват sql запроса, который генерится Entity Framework
Спасибо за ссылку =) На этом же сайте нашел статейку про валидацию данных перед сохранением . Через 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
28.10.2009, 12:19
    #36276804
cha0ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват sql запроса, который генерится Entity Framework
Хех, представляете оказывается это возможно. Вычитал в обсуждении на 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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Перехват sql запроса, который генерится Entity Framework / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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