我们使用 Azure 弹性池,生成多个客户端数据库和一个引用客户端数据库的主数据库。
我们已经拥有多个数据库,并且正在开发新版本的代码。我们使用 EF6 代码优先。
当我们对模型进行更改(添加属性)时,我们会创建迁移文件,并需要为所有现有客户端数据库调用 Update-Database
。
这是我们想要跳过的猴子工作。
我已经有一个 Powershell 脚本来连接到主数据库并对表执行查询。这将返回子数据库的名称。 有了它,我可以更改 Web.config 并将模板数据库名称替换为子数据库的正确名称。
现在我需要调用Update-Database
来执行迁移脚本。对于最后一部分,我很困难,因为我在 Visual Studio 外部运行 ps1 脚本,因此命令 Update-database
是未知的。我尝试使用 migrate.exe
但随后出现很多错误。
我认为最简单的解决方案是在包管理器控制台
中运行我的脚本,但我不知道如何做到这一点。
最佳答案
我设法让它工作。将 ps1 文件放入代码文件夹的根目录后,我可以使用 .\UpdateDatabases.ps1
在包管理器控制台中运行它。
为了完整起见,这是我创建的脚本。我是 PowerShell 新手,因此可能可以进行一些优化。
cls
$currentPath = (Get-Item -Path ".\" -Verbose).FullName
#Read Web.config
$webConfig = $currentPath + "\<your project>\Web.config"
$doc = (Get-Content $webConfig) -as [Xml]
$DatabaseNamePrefix = $doc.configuration.appSettings.add | where {$_.Key -eq 'DatabaseNamePrefix'}
#Get Master connectionstring
$root = $doc.get_DocumentElement();
foreach($connString in $root.connectionStrings.add | where {$_.Name -eq "Master"})
{
$masterConn = $connString.connectionString
}
#Connect to master database
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $masterConn
#Query Client table for the child database names
$SqlQuery = "select Code from Clients"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
#Put query result in dataset
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
foreach ($row in $DataSet.Tables[0].Rows)
{
$clientDbName = $row[0].ToString().Trim()
#Change Web.Config
foreach($connString in $root.connectionStrings.add | where {$_.Name -eq "DevelopmentDb"})
{
$newDatabaseName = "Database=" + $DatabaseNamePrefix.value + $clientDbName + ";";
$newConn = $connString.connectionString -replace "(Database=.*?;)",$newDatabaseName
$connString.connectionString = $newConn;
}
$doc.Save($webConfig)
#Update database
Update-Database -ConfigurationTypeName Application
}
"Finished"
关于database - 如何使用PowerShell批量调用Update-Database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641932/