- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 EF.Core 和代码优先迁移来更新 SQL 数据库。
每当我添加迁移(包管理器控制台:add-migration
)时,我都会使用众所周知的 update-database
命令更新数据库。有没有办法在完成此命令后自动运行 SQL 批处理脚本(就像您可以在 Visual Studio 中处理构建后事件一样)?
该脚本可以备份数据库或执行其他任务(如设置用户角色等)。
我不想修改现有的迁移来执行此操作,我知道您可以添加类似的内容
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
注意 update-database 在包管理器上下文中运行,pg_dump 在命令 shell (cmd.exe) 中运行 - 因此,您不能在 .cmd 或 .bat 脚本中运行 update-database直接。
最佳答案
我能想到的两个方案
更简单:为什么不用一个简单的批处理文件按顺序执行这两个命令,然后您可以运行批处理文件而不是 Update-Database
命令?您甚至可以从标准项目配置文件中获取最多的参数,这样您就可以在多个项目中使用相同的脚本,而无需更改项目配置文件以外的任何内容。通过这种方式,您可以确保您的其他脚本在实际需要时响应 Update-Database
命令运行
如果这是针对可能以动态方式涉及多个“更新命令”的 Powershell session ,并且您不想使用上述方法,那么您可以尝试订阅 Powershell 引擎 Exiting
事件(即 [System.Management.Automation.PsEngineEvent]::Exiting
)并随时通过其 -Action
参数自动执行脚本作为响应 Update-执行数据库
(但前提是在同一 Powershell session 中)。
有关详细信息和示例,请参阅Register-EngineEvent
命令
在您的操作脚本中,您可以获得事件详细信息(如 $Events[0].MessageData
)并搜索文本 "Database-Update"
,然后执行您想要的命令作为响应。如果 "Database-Update "
文本出现在 session 中的任何意外上下文中,这可能会出错。
您可以在此处查看 Get-Event
命令的详细信息和示例
您可以通过 New-PSSession
session 命令与本地或远程计算机建立持久 session ,以便事件订阅者可以考虑在多个文件中执行的命令。
更多关于不同类型的 Powershell session
https://www.sconstantinou.com/windows-powershell-sessions-pssessions/
关于sql - CodeFirst 迁移 : How to run a database script (C# or SQL) after completion of "update-database" automatically?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62872602/
我是一名优秀的程序员,十分优秀!