EF-Core 5: IDbContextTransaction не имеет определения для GetDbContextTransaction(). Как правильно использовать другой контекст?

Моя проблема в том, что я хочу иметь операции с двумя объектами DbContext (оба созданы с помощью dotnet ef dbcontext scaffold с использованием первого подхода модели).

Я имею дело с архитектурой, которая должна быть модульной, поэтому у меня есть абстрактный базовый класс, который может вставлять определенные таблицы, которые всегда одинаковы. Даже модель и контекст находятся в глобальном проекте, поэтому каждый проект может ссылаться на них напрямую.

я пытаюсь начать транзакцию, а затем вызвать базовый класс для вставки базовых таблиц, которые всегда одинаковы для одной и той же транзакции. После этого я приступаю к сохранению остальных операций, которые отличаются от проекта к проекту.

Везде в Интернете, даже на stackoverflow и msdn.com, я нахожу способ сохранить объект транзакции, возвращаемый context.Database.BeginTransaction(), и передать его второму контексту с помощью context.Database.UseTransaction(tran.GetDbTransaction()).

ссылки:
https://docs.microsoft.com/en-us/ef/core/saving/transactions#share-connection-and-transaction
Транзакция между контекстами

Проблема в том, что компилятор говорит мне, что тип, возвращаемый BeginTransaction(), не имеет члена с именем GetDbTransaction().

Простая передача возвращаемого объекта в UseTransaction() не будет компилироваться, так как компилятор не может преобразовать Microsoft.EntityFrameworkCore.Storage.IDbContextTransaction (возвращается BeginTransaction() в System.Data.Common.DbTransaction (необходимо UseTransaction())

эта ошибка кажется мне такой простой, но почему-то я не могу найти в Интернете ничего, почему мой IDbContextTransaction не имеет этого метода.


person Georg Hirsch    schedule 03.02.2021    source источник


Ответы (1)


GetDbTransaction() — это метод расширения в пространстве имен Microsoft.EntityFrameworkCore.Storage, поэтому вам необходимо иметь объявление using, чтобы включить метод расширения в область видимости.

using Microsoft.EntityFrameworkCore.Storage;
person David Browne - Microsoft    schedule 03.02.2021
comment
Опереди меня..:). Довольно раздражающий аспект использования методов расширения в разных пространствах имен, который никогда не упоминается в документации при ссылке на такие методы. - person Steve Py; 04.02.2021
comment
@StevePy Правда? Это самая первая строка в методе документация - person Ivan Stoev; 04.02.2021
comment
Я имею в виду документацию, подобную тому, что опубликовал OP, в которой описывается, как реализовывать транзакции. Там они ясно показывают пример, который использует .GetDbTransaciton() без упоминания о том, что это метод расширения в другом пространстве имен, на которое вам придется ссылаться. Intellisense может помочь вам распознать это, если вы потрудитесь ввести полное имя метода, и он подхватит добавление пространства имен, но для большинства новых разработчиков, если Intellisense не перечисляет его, когда они начинают печатать, возникает вопрос, документ устарел и т. д. Неприятность, не более того, просто очередные поиски. - person Steve Py; 04.02.2021
comment
спасибо, это очень помогло! Я прочитал часть о том, что это метод расширения, но я даже не знал, что это значит. Я начал работать с С# несколько месяцев назад, и я до сих пор не совсем знаком с некоторыми его функциями (я пришел с С++), поэтому я просто проигнорировал эту часть метода расширения, поскольку документация на самом деле не говорила что-нибудь об этом позже - person Georg Hirsch; 04.02.2021