codefirst迁移:如何在自动完成“更新数据库”后运行数据库脚本(c或sql)?

slwdgvem  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(375)

我使用ef.core和代码优先迁移来更新sql数据库。
每当我添加迁移时(package manager控制台: add-migration ),我正在用已知的 update-database 命令。有没有办法在完成此命令后自动运行sql批处理脚本(就像在VisualStudio中处理生成后事件一样)?
该脚本可以备份数据库或执行其他任务(如设置用户角色等)。
我不想修改现有的迁移来实现这一点,我知道您可以添加如下内容

protected override void Up(MigrationBuilder migrationBuilder)
   {
        var sqlFile = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
                       @"Migrations\20200701103006_MySQLBatch_Up.sql");
        var sqlCommands = System.IO.File.ReadAllText(sqlFile);
        migrationBuilder.Sql(sqlCommands);

        // ...
   }

但我不想这样做,因为这样每次添加新迁移时都必须这样做。
是否有一个事件或方法可以重写以实现它?或者可以触发的东西,比如脚本?
实际上,我想要实现的是让一个脚本或方法调用:

update-database
pg_dump -h localhost -U postgres -p 5432 myDatabase > C:\Temp\myDatabase.sql

注意:更新数据库在包管理器上下文中运行,pg\u dump在命令shell(cmd.exe)中运行-因此,不能直接在.cmd或.bat脚本中运行更新数据库。

fcy6dtqo

fcy6dtqo1#

我能想到两个选择
更简单:为什么不创建一个简单的批处理文件,按顺序执行这两个命令,然后就可以运行批处理文件而不是 Update-Database 命令?您甚至可以从一个标准的项目配置文件中获取最多的参数,这样您就可以在多个项目中使用相同的脚本,而无需更改项目配置文件以外的任何内容。通过这种方式,您可以确保您的附加脚本响应 Update-Database 在实际需要时发出命令
如果这是针对可能以动态方式涉及多个“更新命令”的powershell会话,并且您不希望使用上述方法,那么您可以尝试订阅powershell引擎 Exiting 事件(即。 [System.Management.Automation.PsEngineEvent]::Exiting )并通过其 -Action 参数随时 Update-Database 执行(但仅限于在同一powershell会话中)。
看到了吗 Register-EngineEvent 命令获取详细信息和示例
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/register-engineevent?view=powershell-7
在动作脚本中,您可以获得事件的详细信息(如 $Events[0].MessageData )然后搜索文本 " Database-Update " ,然后执行所需的命令作为响应。如果 " Database-Update " 文本出现在会话中的任何意外上下文中。
你可以复习 Get-Event 命令详细信息和示例
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-event?view=powershell-7
您可以通过设置与本地或远程计算机的持久会话 New-PSSession 会话命令,以便事件订阅服务器可以考虑在多个文件中执行的命令。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/new-pssession?view=powershell-7
有关不同类型的powershell会话的详细信息
https://www.sconstantinou.com/windows-powershell-sessions-pssessions/

1dkrff03

1dkrff032#

我在文档中似乎找不到任何东西可以按照你想要的方式做你想做的事情。
但是,我想到的另一种解决方案是,不要从命令行或作为迁移类的一部分运行脚本,而是在启动时作为自动迁移的一部分运行它们。
所以你可以这样做:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DataContext dataContext)
{
    // migrate changes on startup
    dataContext.Database.Migrate();
    foreach(var file in GetMigrationFiles())//you can write the code that searches a folder for SQL scripts to execute
    {       
       dataContext.Database.ExecuteSqlRaw(File.ReadAllText(file));
    }
}

确保正确订购getmigrationfiles()。
这里的问题是,您还需要编写sql,以便在需要回滚时回滚自定义sql。把它们放在不同的文件夹里。

相关问题