Вопрос по entity-framework, .net – Использование Entity Framework (сначала кода) в производственной миграции

60

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

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

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

Возможный дубликат Entity Framework 4.3 запускает миграции при запуске приложения Ladislav Mrnka

Ваш Ответ

4   ответа
73

который вы можете использовать для перехода на последнюю версию при запуске (или, что лучше, dbinitializer включится при первом доступе к базе данных),MigrateDatabaseToLatestVersion, вы используете это так:

Database.SetInitializer<ObjectContext>(
    new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());

Что касается наличия одного файла на миграцию, если вы включите автоматическую миграцию, вы найдете их вMigrations папка (по умолчанию) в корне вашего проекта.

Соответствующая информация, с примерами, здесь:http: //weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.asp

Куда этот код будет добавлен? Может ли это быть включено в условный оператор для проверки настроек приложения из файла web.config? чтобы при разработке этот код можно было пропустить? Тогда преобразования web.config включат его при публикации выпущенной версии? Doug Chamberlain
Если вам нужно установить инициализатор условно для свойств конфигурации, тогда лучше использовать функцию EF4.3. Обратитесь к этой статье Msdn.microsoft.com / EN-US / данные / jj556606 (Часть «Инициализатор базы данных»), используйте это вместе с преобразованием, и вы настроены WDRust
Больше информации об этом здесь: Msdn.microsoft.com / EN-US / данные / jj591621.aspx # инициализатор И для тех из вас, кто настороженно относится к автоматическим миграциям и обновлениям схемы базы данных и считает, что редактирование сценария вручную безопаснее ... убедитесь, что у вас есть резервная копия, и сначала проверьте ее ради бога !! Bron Davies
Я расширил тему при обновленииэтот вопро, рецензия приветствуется WDRust
6

какую версию Visual Studio вы используете или базу данных, я добавлю здесь ответ, чтобы сказать, что в VS2015 с Microsoft SQL Server это теперь невероятно легко с помощью инструмента «Опубликовать».

Вам не нужно беспокоиться об API, о котором вы говорите. Просто выполняйте свою работу локально, меняя модели, применяя миграцию и т. Д., А затем, когда вы захотите выпустить серверы выпуска / тестирования, используйте инструмент публикации.

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

После того, как у вас есть все ваши миграции и все выполнено локально (возможно, в вашей среде разработки), затем вы публикуете (щелкните правой кнопкой мыши проект, нажмите «Опубликовать ...» Установите флажок «Выполнить код при первой миграции (запускается при запуске приложения)» на вкладке «Настройки», а затем он будет применять миграции при первом доступе к приложению (поэтому в первый раз будет небольшая задержка).

Руководство: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

Удачи

48

Это тоже работает:

var configuration = new MyDbContextConfiguration();
configuration.TargetDatabase = new DbConnectionInfo(
    database.ConnectionString, database.ProviderName);

var migrator = new DbMigrator(configuration);
migrator.Update();

Вы также можете позвонить:

migrator.GetPendingMigrations();

чтобы получить список миграций, которые нужно применить.

+ 1 Это способ справиться с этим вручную. eduncan911
Что такое переменнаяdatabase Вот d512
В этом случае просто DTO со свойствами ConnectionString и ProviderName. Это не часть фреймворка. mackie
Если я использую этот метод, какой инициализатор я должен использовать при создании dbContext? John Shedletsky
В своем конструкторе DbContext просто выполните: Database.SetInitializer <TypeOfMyDbContext> (null); mackie
2

какие миграции выполняются явно в коде, и после большого количества поиска мне удалось разработать следующую технику без необходимости использования класса 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);
}

С уважением

Похожие вопросы