Невозможно добавить миграции EF Core в проект, который регистрирует несколько DbContext

У меня есть консольное приложение с двумя DbContexts. Один настроен с помощью MassTransit, а другой является ссылкой на другой проект, для которого я уже выполняю миграции. Итак, я хочу запустить миграцию в этой службе для DbContext, настроенного MassTransit, и получаю следующее сообщение об ошибке:

«Найдено несколько DbContext. Укажите, какой из них использовать. Используйте параметр «-Context» для команд PowerShell и параметр «--context» для команд dotnet».

Однако, когда я указываю контекст с помощью «миграции dotnet ef add InitialCreate -c CourierServiceDbContext», я получаю следующую ошибку:

«Невозможно создать объект типа CourierServiceDbContext». Чтобы узнать о различных шаблонах, поддерживаемых во время разработки, см. https://go.microsoft.com/fwlink/?linkid=851728"

Чтобы было ясно, я хочу запускать миграции только для DbContext, CourierServiceDbContext, настроенного для MassTransit, а не для упомянутого DbContext, OrdersDbContext.

static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder()
        .UseSerilog((host, log) =>
        {
            string? appBin = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

            log.MinimumLevel.Information();
            log.WriteTo.File($"{appBin}/log/log-{DateTime.Now:yyMMdd_HHmmss}.txt");
            log.WriteTo.Console(LogEventLevel.Debug);
        })
        .ConfigureAppConfiguration((host, builder) =>
        {
            builder.AddJsonFile("appsettings.json", false);
        })
        .ConfigureServices((host, services) =>
        {
            services.AddDbContext<OrdersDbContext>(x =>
                x.UseNpgsql(host.Configuration.GetConnectionString("OrdersConnection")));
            
            services.AddMassTransit(x =>
            {
                x.AddConsumer<CourierDispatchConsumer>();
                
                x.SetKebabCaseEndpointNameFormatter();
                
                x.UsingRabbitMq((context, cfg) =>
                {
                    string vhost = host.Configuration
                        .GetSection("Application")
                        .GetValue<string>("VirtualHost");
                    
                    cfg.Host("localhost", vhost, h =>
                    {
                        h.Username("guest");
                        h.Password("guest");
                    });
                    
                    cfg.ConfigureEndpoints(context);
                    // cfg.UseMessageRetry(x => x.SetRetryPolicy(new RetryPolicyFactory()));
                });

                x.AddSagaStateMachine<CourierStateMachine, CourierState>()
                    .EntityFrameworkRepository(r =>
                    {
                        r.ConcurrencyMode = ConcurrencyMode.Optimistic;
                        
                        r.AddDbContext<DbContext, CourierServiceDbContext>((provider, builder) =>
                        {
                            builder.UseNpgsql(host.Configuration.GetConnectionString("OrdersConnection"), m =>
                            {
                                m.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name);
                                m.MigrationsHistoryTable($"__{nameof(CourierServiceDbContext)}");
                            });
                        });
                    });
            });

            services.AddMassTransitHostedService();
        });
Похожие?
Chris Patterson 26.12.2020 15:46

Не думайте, что это связано. Я думаю, разница в том, что у меня есть 2 проекта, P1 и P2. P1 имеет DbContext, для которого я могу успешно выполнить миграцию ef. Однако в P2 у меня есть конечные автоматы, для которых мне нужно выполнить миграцию, но у меня также есть потребители, которые ссылаются на DbContext в P1, поэтому мне нужно зарегистрировать оба DbContext в HostBuilder.

Albert 27.12.2020 18:31

Комментирование регистрационного кода, который ссылается на DbContext P1, позволяет мне запускать миграции с помощью миграции dotnet ef add InitialCreate -c MyMassTransitDbContext.

Albert 27.12.2020 20:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
577
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел пару вещей, которые мне пришлось сделать, отладив различные ошибки:

  1. Добавьте конструктор к обоим DbContexts, который принимает DbContextOptions вместо того, чтобы просто иметь DbContextOptions
  2. Выполните создание миграции с помощью переключателя контекста, как в «миграциях dotnet ef add InitialCreate -c <your_dbcontext>»
  3. Выполните команду синхронизации базы данных с переключателем контекста, как в «dotnet ef database update -c <your_dbcontext>».

Кроме того, ваш класс, который зависит от DbContext, должен быть зарегистрирован как ограниченный, иначе описанные выше шаги не будут работать.

Это позволит вам зарегистрировать несколько DbContexts в одной и той же службе.

Другие вопросы по теме

Похожие вопросы

C#: как пройтись по членам, определенным через массив в классе
Отображать все детали элемента списка при нажатии на определенный элемент списка с использованием бритвенных страниц и компонента просмотра
Как я могу найти значение функции с помощью MathNet в С#
С#. Console.ReadLine() для двух разных объектов
Выберите только несколько столбцов из таблицы для сопоставления с запросом выбора Odata в C# Web API
Как определить DbSet для автоматически созданной таблицы «многие ко многим» в EF Core 5?
Как скрыть динамические свойства в ядре OData .net
Как получить индекс IEnumerable SelectList?
Когда я использую многопоточность, я могу отправить сообщение из первого потока только один раз, после чего я не могу отправить сообщение из первого потока
Почему для добавления примитивной структуры в список не требуется ключевое слово new. Принимая во внимание, что для добавления непримитивной структуры в список требуется новое ключевое слово? - С#