Использование миграции Entity Framework (code first) в производстве
Я просто изучаю использование миграции EF для нашего проекта, и в частности для выполнения изменений схемы в производстве между выпусками.
Я видел, говорилось, что есть API для выполнения этих миграций во время выполнения с помощью DbMigration
класс, но я не могу найти никаких конкретных примеров.
в идеале, я бы хотел, чтобы один DbMigration
файл для каждого изменения базы данных, и для тех изменений, которые будут применяться автоматически при запуске приложения из текущего версии до последней версии.
4 ответа:
существует инициализатор базы данных, который вы можете использовать для достижения перехода на последнюю версию при запуске (или лучше, dbinitializer будет работать при первом доступе к БД),
MigrateDatabaseToLatestVersion
, вы используете его так:Database.SetInitializer<ObjectContext>( new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());
Что касается наличия одного файла на миграцию, если вы включите автоматическую миграцию, вы найдете их в (по умолчанию) в корне вашего проекта.
соответствующая информация, с примерами, здесь: http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx
это тоже работает:
var configuration = new MyDbContextConfiguration(); configuration.TargetDatabase = new DbConnectionInfo( database.ConnectionString, database.ProviderName); var migrator = new DbMigrator(configuration); migrator.Update();
вы также можете позвонить:
migrator.GetPendingMigrations();
чтобы получить список миграций, которые он должен применить.
поскольку вы не указали, какую версию Visual Studio вы используете или базу данных, я добавлю ответ здесь, чтобы сказать, что в VS2015 с Microsoft SQL Server это теперь невероятно легко использовать инструмент "публикация".
вам не нужно беспокоиться об API, о котором вы говорите. Просто выполняйте свою работу локально, меняя модели, применяя миграции и т. д., а затем, когда вы хотите выйти на серверы выпуска/тестирования, используйте инструмент публикации.
вы можете выбрать, чтобы применить любой миграции, выполненные локально, на удаленный сервер при первом запуске приложения.
после того, как у вас есть все ваши миграции и все сделано локально (предположительно в вашем Dev env), то вы публикуете (щелкните правой кнопкой мыши проект, нажмите кнопку "Опубликовать..."Установите флажок" Выполнить первую миграцию кода (выполняется при запуске приложения) "на вкладке" Настройки", а затем он применит миграции при первом доступе к приложению (поэтому первая задержка будет короткой время.)
руководство: https://msdn.microsoft.com/en-us/library/dd465337 (v=vs. 110). aspx
Я узнал все это потому, что я должен был сделать это на сервере Windows 2012 : http://www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/
удачи!
Я хотел контролировать, какие миграции выполняются явно в коде, и после большого поиска мне удалось разработать следующую технику без необходимости использования класса DbConfiguration или автоматической миграции:
public static void RunMigration(this DbContext context, DbMigration migration) { var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance); if (prop != null) { IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>; var generator = new SqlServerMigrationSqlGenerator(); var statements = generator.Generate(operations, "2008"); foreach (MigrationStatement item in statements) context.Database.ExecuteSqlCommand(item.Sql); } }
и если бы у нас была миграция такой:
public class CreateIndexOnContactCodeMigration : DbMigration { public override void Up() { this.CreateIndex("Contacts", "Code"); } public override void Down() { base.Down(); this.DropIndex("Contacts", "Code"); } }
мы бы использовали его так:
using (var dbCrm = new CrmDbContext(connectionString)) { var migration = new CreateIndexOnContactCodeMigration(); migration.Up(); dbCrm.RunMigration(migration); }
С уважением.