在docker容器中包含Entity Framework工具

时间:2018-02-12 15:11:04

标签: c# entity-framework asp.net-core .net-core entity-framework-core

我使用https://www.jfrog.com/confluence/display/CLI/CLI+for+JFrog+Artifactory#CLIforJFrogArtifactory-CollectingBuildInformation docker镜像使用EF Core运行ASP.NET Core应用程序。运行应用程序工作,但我无法使用任何工具。

dotnet ef database update等命令失败。

是否可以在没有完整SDK的情况下运行任何DotNetCliToolReference工具?

2 个答案:

答案 0 :(得分:4)

您无法在制作中使用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();
    }

或直接通过在DbContext类中调用Database.Migrate()

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

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

我建议使用第一个选项,因为迁移仅在应用程序启动时完成。但是第二个将在创建DbContext时调用(最有可能在每个请求中,如果你保持默认的DbContext范围 - 作为一个Scoped服务)

答案 1 :(得分:4)

  

是否可以在没有完整SDK的情况下运行任何DotNetCliToolReference工具?

没有。执行这些工具的逻辑存在于SDK中。

但是,如果你在带有SDK的计算机上使用--verbose运行它,你会看到一行如下所示:

dotnet exec ... ef.dll ...

可以在容器内运行该命令。