2012-06-30 84 views
12

如何遷移沒有nuget的數據庫?在生產環境中使用帶有nuget的Visual Studio是不可能的。目前,很多示例只教會我們使用帶有nuget的Visual Studio。 如何使用生成的DbMigration類?EF Code First DbMigration without nuget

回答

12

最簡單的方法是:

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

初始化的DbContext時,這將運行遷移。

您還可以強制手動執行:

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

(我相信你也必須設置TargetDatabase上的配置,但你可以試試)

2

您可以使用EF Power Tools進行此操作,您可以使用migrate.exe程序從命令提示符運行遷移(例如發佈後)。如果要在生產數據庫上運行遷移,還可以使用Update-Database命令從遷移類生成SQL腳本,如果需要通過DBA,則非常有用。

EF Power Tools可在Visual Studio Gallery上找到,也可以選擇here,查看這個非常有用的video,其中包括討論Update-Database命令。

4

您可以使用遷移到最新版本Web.config設置 - 請參閱this blog post by Rowan Miller

如果使用Code First Migrations,則可以使用MigrateDatabaseToLatestVersion initializ自動遷移數據庫呃。

<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. 使用可從 DbMigrator類獲得的運行時API。
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); 
    } 
} 

舉個例子,有像遷移如下:

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

public class CreateIndexOnContactCodeMigration : DbMigration 
{ 
    public override void Up() 
    { 
     this.CreateIndex("Contacts", "Code"); 
    } 

    public override void Down() 
    { 
     base.Down(); 
     this.DropIndex("Contacts", "Code"); 
    } 
} 

你可以用你的DbContext運行

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