Включение инструментов Entity Framework в Docker-контейнер

Я использую образ докера aspnetcore для запуска приложения ASP.NET Core с использованием EF Core. Запуск приложения работает, но я не могу использовать какие-либо инструменты.

Команды как dotnet ef database update потерпеть поражение.

Можно ли запустить любой DotNetCliToolReference оснастка без полного SDK?

2 ответа

Решение

Можно ли запустить какой-либо инструмент DotNetCliToolReference без полного SDK?

Нет. Логика выполнения этих инструментов находится в SDK.

Но если вы запустите это с --verbose на машине с SDK вы увидите строку, которая выглядит следующим образом:

dotnet exec ... ef.dll ...

Вы можете выполнить эту команду внутри контейнера.

Вы не можете использовать DotNetCliToolReference на производстве.

Но вы можете сделать это двумя способами.

Разрешив услугу DbContext и позвонив Database.Migrate()

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>() 
                    .CreateScope()) 
        { 
            serviceScope.ServiceProvider.GetService<DatabaseApplicationContext>() 
                .Database.Migrate(); 
        } 

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }

Или напрямую по телефону Database.Migrate() в классе DbContext

    protected DatabaseApplicationContext()
    {
        Database.Migrate();            
    }

    public DatabaseApplicationContext(DbContextOptions options) : base(options)
    {
        Database.Migrate();
    }

Я бы порекомендовал первый вариант, потому что миграция выполняется только при запуске приложения. Но второй будет вызываться при создании DbContext (скорее всего при каждом запросе, если вы сохраняете область действия DbContext по умолчанию - как сервис Scoped)

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