Asp.net core 发布ASP.NET核心应用程序时自动执行迁移

Asp.net core 发布ASP.NET核心应用程序时自动执行迁移,asp.net-core,webdeploy,entity-framework-core,entity-framework-migrations,webdeploy-3.5,Asp.net Core,Webdeploy,Entity Framework Core,Entity Framework Migrations,Webdeploy 3.5,问题 在使用Web Deploy将ASP 5应用程序发布到IIS时,是否有任何方法可以自动执行迁移代码(EF 7) 我试过了 在project.json中,我在脚本中添加了此代码: “脚本”:{ “预发布”:[“dnx ef数据库更新”,“其他命令…”, “后发布”:[“dnx ef数据库更新”] } 没有一个对我有用 其他信息 我按照上面的说明使用web deploy将我的ASP 5 RC-1 web应用程序部署到IIS 在“发布设置”中执行此操作后,我有: 在ASP 4应用程序中使用

问题

在使用Web Deploy将ASP 5应用程序发布到IIS时,是否有任何方法可以自动执行迁移代码(EF 7)

我试过了

  • project.json
    中,我在
    脚本中添加了此代码:

    “脚本”:{
    “预发布”:[“dnx ef数据库更新”,“其他命令…”,
    “后发布”:[“dnx ef数据库更新”]
    }
    

没有一个对我有用

其他信息

我按照上面的说明使用web deploy将我的ASP 5 RC-1 web应用程序部署到IIS

在“发布设置”中执行此操作后,我有:

在ASP 4应用程序中使用web deploy,我有其他数据库选项:


显然,这个过程现在不起作用。发布后,您应该会找到名为“profile name”—publish.ps1的powershell脚本。然后在靠近文件末尾的这三行下面添加命令。您可能希望使用powershell来简化调试

“调用发布AspNet”|编写详细信息

#调用Publish AspNet执行发布操作


Publish AspNet-publishProperties$publishProperties-packOutput$packOutput

因此我将选项
-environment
添加到我的
ef数据库
命令中。现在它可以工作了:

"postpublish": ["dnx ef database update -e Staging"]
我有四个不同的
appsettings.json
,每个环境都有不同的连接字符串。只需要指示命令工作的环境。

使用context.Database.Migrate() 您可以从
启动
类调用此函数:

using (var context = new MyContext(...))
{
    context.Database.Migrate();
}

它将在应用程序启动时将数据库迁移到最新版本。但是要小心,可能注释掉这段代码,只有当您想运行迁移时才取消修复。

在Startup.cs类中添加这段代码

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
        {
            var context = serviceScope.ServiceProvider.GetService<AppDBContext>(); 
            context.Database.Migrate(); 
        }
    }
public void配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
使用(var serviceScope=app.ApplicationServices.GetRequiredService().CreateScope())
{
var context=serviceScope.ServiceProvider.GetService();
Migrate();
}
}

请查看我的答案。它可能对您有用。在哪里可以找到project.json?请小心。如果您在本地进行了新迁移,并且您的一名开发人员将其本地数据库连接字符串切换为远程连接字符串(如测试/暂存或更糟糕的prod)然后,这将在远程数据库准备就绪之前尝试在远程数据库上运行新的迁移。@TroyGrosfield说得通@TroyGrosfield为什么有权访问生产服务器?我将为自动数据库部署创建测试项目,并对其运行测试。这个
context.Database.Migrate()
方法有助于在每次运行测试时恢复数据库。因为每次添加
context.Database.EnsureDeleted()时都需要创建新的db上面的一行删除数据库。在使用这种方法时,我会非常小心,特别是在安全性不那么严格的地方,并且通常会让首席开发人员访问生产数据库。哪个过程?context.Database.Migrate()?