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

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

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

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

 Ladislav Mrnka01 июн. 2012 г., 12:54

Ответы на вопрос(4)

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

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

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

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

migrator.GetPendingMigrations();

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

 mackie20 февр. 2015 г., 08:54
В своем конструкторе DbContext просто выполните: Database.SetInitializer <TypeOfMyDbContext> (null);
 eduncan91101 янв. 2013 г., 03:57
+ 1 Это способ справиться с этим вручную.
 John Shedletsky19 февр. 2015 г., 00:19
Если я использую этот метод, какой инициализатор я должен использовать при создании dbContext?
 mackie15 июл. 2014 г., 10:23
В этом случае просто DTO со свойствами ConnectionString и ProviderName. Это не часть фреймворка.
 d51213 июл. 2014 г., 22:56
Что такое переменнаяdatabase Вот

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

С уважением

какую версию 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

Удачи

Решение Вопроса

который вы можете использовать для перехода на последнюю версию при запуске (или, что лучше, 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

 WDRust09 мая 2016 г., 09:50
Я расширил тему при обновленииэтот вопро, рецензия приветствуется
 Doug Chamberlain24 июн. 2013 г., 15:35
Куда этот код будет добавлен? Может ли это быть включено в условный оператор для проверки настроек приложения из файла web.config? чтобы при разработке этот код можно было пропустить? Тогда преобразования web.config включат его при публикации выпущенной версии?
 Bron Davies19 янв. 2016 г., 17:21
Больше информации об этом здесь: Msdn.microsoft.com / EN-US / данные / jj591621.aspx # инициализатор И для тех из вас, кто настороженно относится к автоматическим миграциям и обновлениям схемы базы данных и считает, что редактирование сценария вручную безопаснее ... убедитесь, что у вас есть резервная копия, и сначала проверьте ее ради бога !!
 WDRust24 июн. 2013 г., 16:34
Если вам нужно установить инициализатор условно для свойств конфигурации, тогда лучше использовать функцию EF4.3. Обратитесь к этой статье Msdn.microsoft.com / EN-US / данные / jj556606 (Часть «Инициализатор базы данных»), используйте это вместе с преобразованием, и вы настроены

Ваш ответ на вопрос