database - 如何使用PowerShell批量调用Update-Database

标签 database powershell azure visual-studio-2015

我们使用 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/

相关文章:

sql - 将字符串转换为日期并在给定字符串无效时引发异常

PowerShell区分大小写的字母字符顺序?

json - Power shell 脚本在 Windows powershell ISE 中运行良好,但在 Power shell 版本 5 中不起作用

azure - 从 Visual Studio Online 部署 Azure 云服务

database - 是否有任何符合 ACID 标准的 NoSQL 数据存储?

php - 从数据库中获取两个图像路径并将它们循环显示在 slider 中

mysql - 数据库迁移 : auto-incremented foreign key trouble

azure - 使用 Powershell 创建 Azure 存储帐户的 SFTP 本地用户

Azure Pipelines "Require Template"检查不起作用

c# - 如何在 .NET core 中使用 Microsoft 身份验证提取生成的 token ?