2016-09-22 16 views
0

Azure Elastic Poolを使用して複数のクライアントデータベースと1つのマスターデータベースを作成し、クライアントデータベースを参照します。PowerShellを使用してバッチコールを呼び出す方法Update-Database

すでに複数のデータベースがあり、新しいバージョンのコードを作成しています。 EF6 Code-Firstを使用します。 モデルを変更(プロパティを追加)すると、移行ファイルが作成され、既存のすべてのクライアントデータベースに対してUpdate-Databaseを呼び出す必要があります。 これはスキップしたい猿の仕事です。

私は既に、マスターデータベースに接続してテーブルのクエリを実行するPowershellスクリプトを持っています。これにより、子データベースの名前が返されます。 これで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-runentity-framewor –

答えて

0

私はそれを稼働させることができました。 ps1ファイルを自分のコードフォルダのルートに置いた後、.\UpdateDatabases.ps1を使ってパッケージマネージャコンソールで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" 
関連する問題