ASP.NET MVC 4, миграции - как запустить "update-database" на производственном сервере
Я могу использовать диспетчер пакетов для запуска "update-database-verbose" локально.
вероятно, глупый вопрос, но я не могу найти его в интернете-как только мой сайт будет развернут - как я могу запустить это вручную на сервере?
во-вторых-какие другие стратегии вы бы рекомендовали для развертывания миграции баз данных в производство - и как они были бы предпочтительнее?
спасибо
7 ответов
у вас есть несколько вариантов:
- вы могли бы использовать
update-database -script
для генерации команд SQL для обновления базы данных на сервере - можно использовать миграция.exe исполняемый файл, который находится в папке пакета на
/packages/EntityFramework5.0.0/tools/migrate.exe
. Я успешно использовал его в прошлом с сервером Team City Build Jet Brains для настройки миграций с помощью сценариев развертывания. - если вы используете IIS Web Deploy, вы можете указать серверу выполнить миграции после публикации (см. рис. ниже)
- вы можете настроить автоматическую миграцию, но я предпочитаю контролировать когда что-то происходит :)
обновление: кроме того, проверьте блог Саида Ибрагима, он работает в команде MsBuild в Microsoft и имеет некоторые большие идеи о развертываниях
Я знаю, что на вопрос уже дан ответ, но для справки:
один из вариантов-поместить что-то подобное в конструктор вашего класса контекста DB:
public MyDbContext()
{
System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());
}
для нас DBAs-единственная группа, имеющая доступ к производственным (и предпроизводственным) средам. Мы просто используем Update-Database -Script
команда консоли пакета, чтобы получить Sql, необходимый для обновления базы данных. Это передается им, где они могут подтвердить это и т. д.
может быть, слишком упрощенно для некоторых, но это работает.
HTH.
Мне лично нравится настраивать автоматические миграции, которые запускаются каждый раз, когда вызывается метод запуска приложения. Таким образом, при каждом развертывании у вас есть миграции просто запустить и обновить приложение автоматически.
проверьте этот пост из AppHarbor. http://blog.appharbor.com/2012/04/24/automatic-migrations-with-entity-framework-4-3
суть в том, что вы хотите включить автоматическую миграцию, а затем вызвать DatabaseInitializer из вашего кода, либо от метод OnModelCreating или из глобального.асакс.
простое решение: работает Update-Database
из локальной консоли диспетчера пакетов, предоставляющей параметр строки подключения с производственной строкой подключения. Вы также должны указать имя поставщика подключения (SqlServer в этом примере кода):
Update-Database -ConnectionString <your real remote server connection string here> -ConnectionProviderName System.Data.SqlClient
вместо строки подключения вы можете использовать имя строки подключения, присутствующее в вашем приложении.файл config :
Update-Database -ConnectionStringName <your connection string name here>
у вас должны быть разрешения на доступ к этому серверу с вашего локального машина. Например, если вы можете подключиться к серверу из среды SQL Server Management Studio, вы можете использовать это.
обратите внимание, что этот подход не рекомендуется для реальной производственной системы, вы должны использовать что-то вроде того, что описано в принятой ответ. Но это может помочь вам с быстрыми взломами в разработке удаленных серверов, тестовых сред и т. д.
вы можете получить сценарии с помощью команд EF (update-database-script) или вы можете написать сценарий вручную. Это не самое главное в обновлении базы данных в производственной среде. Для меня самое главное-убедиться, что все скрипты были запущены правильно, и они повлияли на записи, как и ожидалось. На мой взгляд, у вас должна быть среда подготовки производства, а база данных должна быть копией производственной среды. Таким образом, вы можете запускать скрипты и разверните приложение в довольно похожей среде и посмотрите, есть ли какие-либо проблемы. Иногда сценарии выполняются правильно в среде разработки, но они терпят неудачу в рабочей среде. Чтобы избежать головной боли, следует имитировать производственную среду в среде подготовки производства. Что касается скриптов, если команда имеет более одного разработчика, я предпочитаю классифицировать скрипты в скриптах структуры и скриптах данных. Скрипты структуры изменяют структуру базы данных (добавить таблицу, добавить столбец к таблице и т. д.) и скрипты данных вставляет/обновляет / удаляет записи. Кроме того, каждый скрипт должен указывать свои зависимости, чтобы они не могли выполняться в неправильном порядке. Сценарий данных, вставляющий строки в таблицу A, не может быть выполнен до создания таблицы A. Вот что я делаю.: - Определите таблицу для регистрации выполненных скриптов. Например: ExecutedScriptsHistory. - Каждый сценарий имеет номер и имя. -После выполнения скрипта в таблицу вставляется новая строка ExecutedScriptsHistory. - Перед выполнением скрипта он проверяет его зависимости. Для этого он проверяет, были ли выполнены сценарии (существует в таблице ExecutedScriptsHistory).
после запуска скриптов Вы можете проверить, были ли выполнены все скрипты, проверяя ExecutedScriptsHistory. Эта стратегия аналогична стратегии, выбранной Microsoft в миграции EF, но вы полностью контролируете ее.
просто дать всем простой ответ.
Это "обновление базы данных" В папке миграции Configuration.cs:
internal sealed class Configuration : DbMigrationsConfiguration<projectname.Models.dbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true; // Update-Data -Force (deletes columns etc)
}
и чтобы" включить миграции " в первую очередь на удаленном сервере, добавьте это в свой глобальный.асакс.cs файл:
protected void Application_Start()
{
....
System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext, Migrations.Configuration>());