Squeak.ru - шаблоны программирования

Получение DbContext из реализации IDbCommandInterceptor

Я использую реализацию IDbCommandInterceptor:

public class MyInterceptor : IDbCommandInterceptor
{
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        var context = interceptionContext.DbContexts.FirstOrDefault();
    }

    public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
    }

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
    }

    public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
    }

    public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
    }

    public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
    }
}

Введено этим:

public class TestContext : System.Data.Entity.DbContext
{
    // …

    public TestContext()
        : base("TestConnectionString")
    {
        Database.SetInitializer<TestContext>(null);
        DbInterception.Add(new MyInterceptor());
    }
}

(также пробовал в статическом конструкторе).

Но interceptionContext.DbContexts всегда пусто. Как я могу получить экземпляр исполняемого контекста? Является ли это возможным?


Ответы:


1

Это не полностью отвечает на мой вопрос, но объяснение, которое я нашел в документации Entity Framework, было наиболее точный:

Стоит отметить, что контекст перехвата — это лучшая попытка предоставить контекстную информацию. Однако в некоторых крайних случаях некоторая информация, которую вы ожидаете, может отсутствовать. Это связано с тем, что в EF есть пути кода, которые нельзя легко изменить, и они не включают информацию, которую можно было бы ожидать. Например, когда EF вызывает поставщика, поставщик не знает об используемом DbContext. Если этот поставщик вне EF решит вызвать ExecuteNonQuery, могут произойти две вещи:

  • Сначала провайдер может просто позвонить напрямую, полностью избегая перехвата EF. (Это следствие наличия перехвата на уровне EF, а не ниже в стеке. Было бы здорово, если бы перехват был ниже в стеке, но, к сожалению, это находится вне контроля команды EF.)
  • Если поставщик знает о перехвате EF, он может отправить вызов ExecuteNonQuery через перехватчики EF. Это означает, что любой зарегистрированный перехватчик будет уведомлен и сможет действовать соответствующим образом. Это то, что делают поставщики SQL Server и SQL Server Compact. Однако, даже когда провайдер делает это, вполне вероятно, что используемый DbContext не будет включен в контекст перехвата, потому что провайдер ничего о нем не знает, и изменение, разрешающее это, нарушило бы четко определенные API-интерфейсы провайдера.

К счастью, такая ситуация встречается редко и, вероятно, не будет проблемой для большинства приложений.

Не знаю, насколько моя ситуация «редкая», но, возможно, я делаю что-то не так…

16.03.2015
  • Я также пытаюсь исследовать этот вопрос и пришел к выводу, что перехват — это гигантская куча взломов, добавленных запоздало. Большая проблема заключается в том, что DbInterception является статическим классом, и поэтому весь перехват является глобальным для домена приложения. Вы не можете создать IsolationLevelDbCommandInterceptor, который изменяет уровень изоляции только для одного контекста. Точно так же нет способа гарантировать, что контекст добавляется только один раз. 27.01.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...