EF Code First DbMigration без nuget

Как переносить DB без nuget? Невозможно использовать Visual Studio с nuget в рабочей среде. В настоящее время многие примеры только обучают нас использованию Visual Studio с nuget. Как использовать сгенерированные классы DbMigration?

Ответ 1

Самый простой способ:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<MyDbContext,
                                       MyDbMigrationsConfiguration>());

Это приведет к миграции при инициализации DbContext.

Вы также можете принудительно выполнить выполнение:

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

(Я считаю, вам также нужно установить TargetDatabase в настройке, но вы можете попробовать)

Ответ 2

Вот варианты:

  • Используйте инструмент командной строки migrate.exe, который поставляется в нашем NuGet пакет.
  • Используйте инициализатор MigrateDatabaseToLatestVersion как другие описали.
  • Используйте API-интерфейс времени выполнения, доступный из Класс DbMigrator.

Ответ 3

Вы можете перейти на последнюю версию, используя настройку Web.config - см. этот пост в блоге Роуэн Миллер:

Если вы используете First First Migrations, вы можете настроить автоматическую миграцию базы данных с помощью инициализатора MigrateDatabaseToLatestVersion.

<contexts>
  <context type="Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, 
MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>

Просто поменяйте свой контекстный класс здесь: System.Data.Entity.MigrateDatabaseToLatestVersion встроен в EF. Этот параметр обновляет прежнюю версию AppSettings той же идеи.

На мой взгляд, это лучший способ, потому что вопрос о том, какой инициализатор использовать, действительно является конфигурацией, и вы хотите иметь возможность Web.config, и в идеале применять конфигурационные преобразования для работы в разных средах.

Ответ 4

Вы можете сделать это с помощью EF Power Tools, там есть программа migrate.exe, которую вы можете использовать для запуска миграции из командной строки (например, пост-сборка). Если вы хотите запускать миграции в производственной базе данных, вы также можете использовать команду "Обновить базу данных" для генерации сценариев SQL из классов миграции, что очень полезно, если вам нужно пройти через администратор базы данных.

Инструменты EF Power доступны в галерее Visual Studio и, необязательно, здесь, ознакомьтесь с этой очень полезной , который, между прочим, рассказывает о команде Update-Database.

Ответ 5

существует другое решение:

 Using DB = New SHAContext()
        If DB.Database.Exists() Then
            Dim migrator As New DbMigrator(New SHAClassLibrary.Migrations.Configuration())
            For Each m In migrator.GetDatabaseMigrations()
                Try
                    migrator.Update(m)
                Catch ex As Exception

                End Try
            Next
        End If
        'DB.test()
    End Using

Ответ 6

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

Вы можете запустить его с помощью DbContext:

using (var dbCrm = new CrmDbContext(connectionString))
{
    var migration = new CreateIndexOnContactCodeMigration();
    migration.Up();                
    dbCrm.RunMigration(migration);
}