在Docker容器中包含Entity Framework工具

4
我正在使用aspnetcore docker镜像来运行一个使用EF Core的ASP.NET Core应用程序。应用程序可以正常运行,但我无法使用任何工具。

例如dotnet ef database update命令失败。

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

2个回答

5

没有完整的SDK,是否可以运行任何DotNetCliToolReference工具?

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

但是,如果在安装了SDK的机器上使用--verbose运行此命令,您会看到一行类似于以下内容的信息:

dotnet exec ... ef.dll ...

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


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服务,则很可能在每个请求中都会调用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接