Миграция EF Core (1.0.0) в Azure App Services

У нас есть веб-приложение (Net Core 1.0.0-preview2-003121), развернутое в службе приложений Azure, и мы изо всех сил пытаемся развернуть миграцию.

В RC1/2 можно было выполнять миграции с помощью файла ef.cmd, который, казалось, был там автоматически, а именно мы могли использовать этот файл для запуска

dnx ef database update 

но это прошло.

dotnet ef не установлен в самой службе приложений Azure, поэтому это не вариант.

Любые идеи, которые не связаны с запуском миграции из кода/развертыванием их из Visual Studio?

Мы пытаемся создать непрерывный конвейер развертывания, и я бы предпочел избегать принудительного развертывания миграций из кода.

МОЯ гугл-фу явно меня здесь не устраивает, так как она не может найти ничего в моей жизни, и я не могу быть единственным, кто пытается развернуть миграции на сервере.

ТИА


person ManyRootsofAllEvil    schedule 21.09.2016    source источник
comment
Интерфейс командной строки изменился. docs.efproject.net/en/latest/miscellaneous/cli/dotnet. html   -  person Benjamin Abt    schedule 21.09.2016
comment
@ Бен, это действительно так. Я сослался на этот факт в сообщении, упомянув, что dotnet ef не установлен, вероятно, не ясно, что я имел в виду на самой службе приложений Azure, а не на моей машине.   -  person ManyRootsofAllEvil    schedule 23.09.2016


Ответы (1)


В итоге мы сделали следующее:

На стороне сборки мы генерируем идемпотентный скрипт создания базы данных:

dotnet ef migrations script --idempotent --output migrations.sql  --context  ApplicationContext

Где ApplicationContext — это имя вашего контекста EF, а migrations.sql — это имя файла сценария sql.

Затем на стороне развертывания у нас есть небольшой скрипт powershell, который эффективно запускает скрипт migrations.sql.

param(
[Parameter(Mandatory)]
[string]$server,
[Parameter(Mandatory)]
[string]$dbname,
[Parameter(Mandatory)]
[string]$dbadmin,
[Parameter(Mandatory)]
[string]$dbpassword,
[Parameter(Mandatory)]
[string]$migrationPath
)

function Deploy-Migrations ($migrationPath,$DBSettings)
{
   #Setting up database connection
   $connection = New-Object System.Data.SqlClient.SqlConnection
   $connection.ConnectionString = [string]::Format("Data Source=tcp:{0}.database.windows.net,1433;Initial Catalog={1};User Id={2}@{0};Password={3};MultipleActiveResultSets=True", $DBsettings['sqlServerName'], $DBsettings['databasename'],$DBsettings['adminAccount'], $DBsettings['adminPassword']) 

    try
    {
        $connection.Open();

         $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
         $SqlCmd.Connection = $connection
         $query = Get-Content $migrationPath
         $sqlCmd.CommandText = $query.Replace("GO","") # This is required to prevent "syntax" complaints
         $sqlCmd.ExecuteNonQuery()

         Write-Host "Migration Deployed" 
    }
    Catch
    {

        Write-Error "oops ... PAnic ... $($_.Exception.Message) on $($_.Exception.ItemName)"
        break
    }
    Finally
    {
        $connection.Close()
    }  
 }

$DBSettings = @{"sqlServerName"=$server; "databasename"=$dbname;    "adminAccount"=$dbadmin; "adminPassword"=$dbpassword }

Deploy-Migrations $migrationPath $DBSettings
person ManyRootsofAllEvil    schedule 24.01.2017
comment
Спасибо за это. Иногда работа с ASP.NET Core заставляет меня чувствовать, что я единственный человек в мире, который когда-либо его использовал. О_О SQL скрипты это.... - person John Hargrove; 24.02.2017