2016-09-22 73 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"