Перехват и изменение sql запроса, сгенерированного Приложением - PullRequest
0 голосов
/ 28 марта 2020

У меня есть ситуация, когда плагин запрашивает и получает некоторые данные, я не могу изменить запрос в плагине как его DLL. Я проверил с помощью профилировщика SQL, какой запрос он выполняет, и в соответствии с нашим требованием мы изменили схему базы данных в этой области, тем самым нарушив этот запрос плагина.

Есть ли способ перехватить запрос и изменить это?

Точно так же, как мы делаем в JS инфраструктуре, такой как Angular, что у нас есть перехватчик для приема каждого вызова и добавления токена в заголовок, есть ли у нас что-то подобное для перехвата всех исходящих SQL звонит и переделывает?

Может быть, промежуточное программное обеспечение может работать здесь, как я. NET -Core или какой-то другой обработчик?

1 Ответ

1 голос
/ 28 марта 2020

Запрос может быть изменен в перехватчике.

EF 6

Реализация IDbCommandInterceptor, например:

class EFCommandInterceptor: IDbCommandInterceptor
{

    public void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
        // Manipulate the command text, etc. here...
        command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
    }

    ...

Регистрация:

public class FE6CodeConfig : DbConfiguration
{
    public FE6CodeConfig()
    {
        this.AddInterceptor(new EFCommandInterceptor());
    }
}

Подробнее здесь

EF Core

Также EF Core имеет перехватчики в настоящее время . Вам нужен EF Core 3 или более поздней версии.

В то время как EF Core 3 требуется. NET Стандарт 2.1 (т. NET Core 3 и более поздние версии), EF Core 3.1 поддерживает. NET Стандарт 2.0, т. Е. NET Core 2 и. NET Framework 4.6.1 +

Наследование DbCommandInterceptor, например,

public class HintCommandInterceptor : DbCommandInterceptor
{
    public override InterceptionResult ReaderExecuting(
        DbCommand command,
        CommandEventData eventData,
        InterceptionResult result)
    {
        // Manipulate the command text, etc. here...
        command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
        return result;
    }
}

Регистрация:

services.AddDbContext(b => b
    .UseSqlServer(connectionString)
    .AddInterceptors(new HintCommandInterceptor())
...