【问题标题】:Including Entity Framework tooling in docker container在 docker 容器中包含实体框架工具
【发布时间】:2018-07-22 19:16:20
【问题描述】:
我正在使用aspnetcore docker 映像来运行使用 EF Core 的 ASP.NET Core 应用程序。运行应用程序有效,但我无法使用任何工具。
dotnet ef database update 之类的命令失败。
是否可以在没有完整 SDK 的情况下运行任何 DotNetCliToolReference 工具?
【问题讨论】:
标签:
c#
entity-framework
asp.net-core
.net-core
entity-framework-core
【解决方案1】:
是否可以在没有完整 SDK 的情况下运行任何 DotNetCliToolReference 工具?
没有。执行这些工具的逻辑位于 SDK 中。
但是,如果您在带有 SDK 的机器上使用 --verbose 运行此程序,您会看到如下所示的一行:
dotnet exec ... ef.dll ...
您可以在容器内运行该命令。
【解决方案2】:
您不能在生产中使用 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 服务)