2012-06-30 3 views
12

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

ответ

12

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

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

Это будет запускать миграции при инициализации DbContext.

Можно также принудительно выполнение вручную:

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

(я полагаю, вы также должны установить TargetDatabase от конфигурации, но вы можете попробовать)

2

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

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

4

Вы можете перейти на последнюю версию с помощью Настройка Web.config - см. this blog post by Rowan Miller:

Если вы используете 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, и в идеале применять конфигурационные преобразования для работы в разных средах ,

5

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

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

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

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

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 
Смежные вопросы