【问题标题】: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 服务)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 2015-09-08
        相关资源
        最近更新 更多