发布ASP.NET Core应用程序时自动执行迁移

12

问题

有没有办法在使用Web Deploy将ASP 5应用程序发布到IIS时自动执行迁移代码(EF 7)?

我尝试了

  • project.json中,我在scripts中添加了以下代码:

    "scripts" : { "prepublish": ["dnx ef database update", "other commands..."], "postpublish": ["dnx ef database update"] }

对我都没有起作用。

附加信息

我按照这个链接中的说明,使用Web Deploy将我的ASP 5 RC-1 Web应用程序部署到IIS。

在进行后续操作时,我有以下发布设置:

ASP 5 RC 1 publish to IIS using Web Deploy

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

ASP 4 publish to IIS using Web Deploy


请看我的回答。它可能对你有用。 - Andrei
一个人在哪里可以找到project.json文件? - Ben Donnelly
5个回答

8

使用context.Database.Migrate()

您可以从Startup类中调用此方法:

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

它将在应用程序启动时将您的数据库迁移到最新版本。但是要小心操作,也许可以注释掉此代码,只有在您想运行迁移时才取消注释。


4
做这件事要小心。如果你的开发人员之一将本地数据库连接字符串切换到远程连接字符串(例如测试/暂存或更糟的生产环境),而你又有新的迁移文件在本地,则会尝试在远程数据库上运行尚未准备好的新迁移文件。 - Troy Grosfield
@TroyGrosfield 说得有道理。 - Andrei
6
@TroyGrosfield为什么能够访问生产服务器? - THBBFT
我将创建一个测试项目,用于自动化数据库部署和运行测试。这个 context.Database.Migrate() 方法可以帮助每次运行测试时恢复数据库。由于我需要每次都创建新的数据库,因此我添加了一行 context.Database.EnsureDeleted(); 来删除数据库。 - Alezis
1
在使用这种方法时,我会非常小心,特别是在安全性不太严格的地方,比如说主要开发人员可以访问生产数据库的情况非常普遍。 - Pepito Fernandez

1

显然这个过程现在不起作用了。https://github.com/aspnet/Home/issues/622发布后,您应该会找到名为“配置文件名称-publish.ps1”的PowerShell脚本。然后在此文件末尾附近添加您的命令。您可能想使用PowerShell来更轻松地进行调试。

'Calling Publish-AspNet' | Write-Verbose

# 调用Publish-AspNet执行发布操作

Publish-AspNet -publishProperties $publishProperties -packOutput $packOutput


1
哪个进程?context.Database.Migrate()? - Michael Freidgeim

1

所以我在我的ef database命令中添加了-environment选项。现在它可以正常工作:

"postpublish": ["dnx ef database update -e Staging"]

我有四个不同的appsettings.json文件,每个环境都有不同的连接字符串。只需要指定环境即可使命令正常工作。

1
在你的 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(); 
        }
    }

0

.Net6或更高版本

我使用下面的代码,对我来说很有效


using (var scope = builder.Services.BuildServiceProvider().CreateScope())
{
    using(var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>())
    {
        if (dbContext.Database.GetPendingMigrations().Any())
        {
            dbContext.Database.Migrate();
        }
    }
}

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