Использование миграции Entity Framework (code first) в производстве


Я просто изучаю использование миграции EF для нашего проекта, и в частности для выполнения изменений схемы в производстве между выпусками.

Я видел, говорилось, что есть API для выполнения этих миграций во время выполнения с помощью DbMigration класс, но я не могу найти никаких конкретных примеров.

в идеале, я бы хотел, чтобы один DbMigration файл для каждого изменения базы данных, и для тех изменений, которые будут применяться автоматически при запуске приложения из текущего версии до последней версии.

4 59

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), то вы публикуете (щелкните правой кнопкой мыши проект, нажмите кнопку "Опубликовать..."Установите флажок" Выполнить первую миграцию кода (выполняется при запуске приложения) "на вкладке" Настройки", а затем он применит миграции при первом доступе к приложению (поэтому первая задержка будет короткой время.)

Publish Web using Web-Deploy

руководство: 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);
}

С уважением.