有没有办法从已发布的DLL运行EF Core RC2工具?

高麦保罗

发布.Net Core RC1应用程序后,在project.json中指定的命令为它们创建了相应的.cmd文件,可以在部署后执行这些文件(例如,web.cmd和ef.cmd)。就我而言,我想在部署目标上运行以下Entity Framework命令:

dotnet ef database update -c MyContext

当我从包含源代码的文件夹中运行此文件时,此方法运行良好,但是在发布后,在编译的DLL中似乎找不到该命令。我对RC2命令更改的理解是,“工具”可以作为名为dotnet-*。dll的独立应用程序进行编译,并且可以通过CLI执行。如何在发布的输出中将Entity Framework Core工具公开为可执行DLL?

仅供参考,我的构建/部署工作流程如下:

团队城市

dotnet恢复=> dotnet构建=> dotnet测试=> dotnet发布

章鱼部署

上传包=> EF更新数据库=>等等

ver

我最终在一个项目中遇到了同样的问题,但是由于多种原因,我不希望迁移在应用程序启动时自动运行。

为了解决这个问题,我更新Program.cs了两个参数(下面列出了完整的代码)

  • --ef-migrate,以应用所有待处理的迁移,以及
  • --ef-migrate-check,以验证是否已应用所有迁移

如果存在参数,则将应用EF操作并退出程序,否则将启动Web应用程序。

请注意,它取决于Microsoft.Extensions.CommandLineUtils软件包,以简化命令行解析。

对于octopus部署,一个人可以将程序包两次发布到不同的位置-一个用于运行迁移,另一个用于虚拟主机。在我们的例子中,我们添加了一个“ post deploy powershell脚本”,其中包含以下内容:

$env:ASPNETCORE_ENVIRONMENT="#{Octopus.Environment.Name}"
dotnet example-app.dll --ef-migrate

在docker上下文中,它也可以完美地工作

docker run -it "example-app-container" dotnet example-app.dll --ef-migrate

完整的Program.cs,不包括名称空间和使用方法:

//Remember to run: dotnet add package Microsoft.Extensions.CommandLineUtils
public class Program
{
    public static void Main(string[] args)
    {
        var commandLineApplication = new CommandLineApplication(false);
        var doMigrate = commandLineApplication.Option(
            "--ef-migrate",
            "Apply entity framework migrations and exit",
            CommandOptionType.NoValue);
        var verifyMigrate = commandLineApplication.Option(
            "--ef-migrate-check",
            "Check the status of entity framework migrations",
            CommandOptionType.NoValue);
        commandLineApplication.HelpOption("-? | -h | --help");
        commandLineApplication.OnExecute(() =>
        {
            ExecuteApp(args, doMigrate, verifyMigrate);
            return 0;
        });
        commandLineApplication.Execute(args);
    }

    private static void ExecuteApp(string[] args, CommandOption doMigrate, CommandOption verifyMigrate)
    {
        Console.WriteLine("Loading web host");
        //
        // Please note that this webHostBuilder below is from an older 
        // dotnet core version. Newer dotnet cores have a simplified version
        // Use that instead and just take the command line parsing stuff with you
        var webHost = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        if (verifyMigrate.HasValue() && doMigrate.HasValue())
        {
            Console.WriteLine("ef-migrate and ef-migrate-check are mutually exclusive, select one, and try again");
            Environment.Exit(2);
        }

        if (verifyMigrate.HasValue())
        {
            Console.WriteLine("Validating status of Entity Framework migrations");
            using (var serviceScope = webHost.Services.GetRequiredService<IServiceScopeFactory>().CreateScope())
            { 
                using (var context = serviceScope.ServiceProvider.GetService<DatabaseContext>())
                {
                    var pendingMigrations = context.Database.GetPendingMigrations();
                    var migrations = pendingMigrations as IList<string> ?? pendingMigrations.ToList();
                    if (!migrations.Any())
                    {
                        Console.WriteLine("No pending migratons");
                        Environment.Exit(0);
                    }

                    Console.WriteLine("Pending migratons {0}", migrations.Count());
                    foreach (var migration in migrations)
                    {
                        Console.WriteLine($"\t{migration}");
                    }

                    Environment.Exit(3);
                }
            }
        }

        if (doMigrate.HasValue())
        {
            Console.WriteLine("Applyting Entity Framework migrations");
            using (var serviceScope = webHost.Services.GetRequiredService<IServiceScopeFactory>().CreateScope())
            {
                using (var context = serviceScope.ServiceProvider.GetService<DatabaseContext>())
                {
                    context.Database.Migrate();
                    Console.WriteLine("All done, closing app");
                    Environment.Exit(0);
                }
            }
        }

        // no flags provided, so just run the webhost
        webHost.Run();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF Core RC2中的迁移

来自分类Dev

是否发布了ASP.NET Core RC2?

来自分类Dev

.NET Core RC2上的MSTest没有xml输出

来自分类Dev

EF Core RC2迁移在发布/部署期间失败

来自分类Dev

指定的帐户已经存在-.NET Core RC2工具预览1

来自分类Dev

Visual Studio 2015 .Net Core RC2工具预览1

来自分类Dev

ASP.NET Core RC2区域未发布

来自分类Dev

EF7 .NET Core 1 RC2添加迁移失败

来自分类Dev

EF Core RC2 FinaI问题:尚未为此DbContext配置数据库提供程序

来自分类Dev

.net Core安装程序(RC2)和.Net Core SDK安装程序(预览1)之间有什么区别?

来自分类Dev

有没有办法在Windows Server 2008 R2 Core上使用“ netsh跟踪”?

来自分类Dev

有没有办法将 .Net Core 2 appsettings.json 属性传递给主干组件?

来自分类Dev

有没有办法在EF Core Postgres JSON中使用列表?

来自分类Dev

升级到asp.net core rc2后,发布到Azure App Service崩溃

来自分类Dev

升级到asp.net core rc2后,发布到Azure App Service崩溃

来自分类Dev

Razor页面在运行时无法在ASP.NET Core RC2中看到引用的类库

来自分类Dev

Razor页面在运行时无法在ASP.NET Core RC2中看到引用的类库

来自分类Dev

具有Identity和ASP.NET Core RC2的实体框架Core无法在数据库中创建用户

来自分类Dev

具有Identity和ASP.NET Core RC2的实体框架Core无法在数据库中创建用户

来自分类Dev

DOTNET CLI RC2 EF迁移

来自分类Dev

DOTNET CLI RC2 EF迁移

来自分类Dev

如何在没有安装程序的情况下卸载MS .NET Core 1.0 RC2 VS 2015 Tooling Preview 1?

来自分类Dev

ASP.NET Core rc2中的全局异常处理可以在没有异常过滤器的情况下工作

来自分类Dev

服务结构中的.NET Core RC2

来自分类Dev

.NET Core RC2中的登录声明

来自分类Dev

在ASP Core 1.0 RC2中无法远程触发

来自分类Dev

ASP Net Core 1 RC2 AccountController注入

来自分类Dev

ASP.NET Core rc2中的Cookie

来自分类Dev

无法在.Net Core RC2中添加视图

Related 相关文章

  1. 1

    EF Core RC2中的迁移

  2. 2

    是否发布了ASP.NET Core RC2?

  3. 3

    .NET Core RC2上的MSTest没有xml输出

  4. 4

    EF Core RC2迁移在发布/部署期间失败

  5. 5

    指定的帐户已经存在-.NET Core RC2工具预览1

  6. 6

    Visual Studio 2015 .Net Core RC2工具预览1

  7. 7

    ASP.NET Core RC2区域未发布

  8. 8

    EF7 .NET Core 1 RC2添加迁移失败

  9. 9

    EF Core RC2 FinaI问题:尚未为此DbContext配置数据库提供程序

  10. 10

    .net Core安装程序(RC2)和.Net Core SDK安装程序(预览1)之间有什么区别?

  11. 11

    有没有办法在Windows Server 2008 R2 Core上使用“ netsh跟踪”?

  12. 12

    有没有办法将 .Net Core 2 appsettings.json 属性传递给主干组件?

  13. 13

    有没有办法在EF Core Postgres JSON中使用列表?

  14. 14

    升级到asp.net core rc2后,发布到Azure App Service崩溃

  15. 15

    升级到asp.net core rc2后,发布到Azure App Service崩溃

  16. 16

    Razor页面在运行时无法在ASP.NET Core RC2中看到引用的类库

  17. 17

    Razor页面在运行时无法在ASP.NET Core RC2中看到引用的类库

  18. 18

    具有Identity和ASP.NET Core RC2的实体框架Core无法在数据库中创建用户

  19. 19

    具有Identity和ASP.NET Core RC2的实体框架Core无法在数据库中创建用户

  20. 20

    DOTNET CLI RC2 EF迁移

  21. 21

    DOTNET CLI RC2 EF迁移

  22. 22

    如何在没有安装程序的情况下卸载MS .NET Core 1.0 RC2 VS 2015 Tooling Preview 1?

  23. 23

    ASP.NET Core rc2中的全局异常处理可以在没有异常过滤器的情况下工作

  24. 24

    服务结构中的.NET Core RC2

  25. 25

    .NET Core RC2中的登录声明

  26. 26

    在ASP Core 1.0 RC2中无法远程触发

  27. 27

    ASP Net Core 1 RC2 AccountController注入

  28. 28

    ASP.NET Core rc2中的Cookie

  29. 29

    无法在.Net Core RC2中添加视图

热门标签

归档