2016-09-22 56 views
0

我们使用Azure弹性池导致多个客户端数据库和一个主数据库引用客户端数据库。如何使用PowerShell批量调用更新数据库

我们已经有多个数据库,并且正在开发新版本的代码。我们使用EF6 Code-First。 当我们对模型进行更改(添加属性)时,我们创建了迁移文件,并且需要为所有现有的客户端数据库调用Update-Database。 这是我们想跳过的猴子作品。

我已经有一个Powershell脚本来连接到master数据库并对表执行查询。这将返回子数据库的名称。 有了它,我可以更改Web.config并将模板数据库名称替换为子数据库的正确名称。

现在我需要拨打Update-Database来执行迁移脚本。由于我在Visual Studio之外运行ps1脚本,因此最后一部分我很挣扎,因此命令Update-database未知。我尝试使用migrate.exe,但后来我得到很多错误。

我认为最简单的解决方案是将Package manager console内运行我的脚本,但我无法弄清楚如何做到这一点。

+0

相关? http://stackoverflow.com/questions/7903711/using-nuget-package-manager-console-outside-visual-studio-to-run-entity-framewor –

回答

0

我设法让它工作。在将ps1文件放入我的代码文件夹的根目录后,我可以使用.\UpdateDatabases.ps1在Package Manager控制台中运行它。

为了完整这里是我创建的脚本。我是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"