2013-08-26 64 views
5

我希望能夠手動執行遷移的Up()方法。目前我試圖做到這一點,但調用包含CreateTable方法不會創建表。我懷疑連接沒有正確設置。並沒有屬性來設置它。在EF中手動調用DbMigration.Up

我也試過DbMigrator,但它調用了一些內部EF遷移方法。

那麼有誰知道如何設置連接以供DbMigration.Up方法使用?

在此先感謝!

+1

實體框架是開源的,所以你可以看看源代碼,找出他們在做什麼使遷移發生。 http://entityframework.codeplex.com/SourceControl/latest –

+0

感謝您的提示。不幸的是我找不到解決方案。看起來我正在嘗試做我不應該做的事情。以其他方式解決問題。 –

回答

4

在過去的遷移完全手動控制,則可以使用下面的擴展方法:

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(); // or migration.Down();     
    dbCrm.RunMigration(migration); 
} 
5

我用下面的代碼,以明確可以升級我的數據庫中的Application_Start事件:

var config = new MyDatabaseMigrationsConfiguration(); 
var migrator = new System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator(new System.Data.Entity.Migrations.DbMigrator(config), new MyCommonMigrationsLogger()); 
if (migrator.GetPendingMigrations().Any()) 
{ 
    migrator.Update(); 
} 

據我知道這將使用從我DatabaseContext ConnectionString中默認(命名),以應用掛起變化。

  • ,如果你想明確
  • 的MyCommonMigrationsLogger您可以指定在migrator.Update()的TargetMigration只是爲System.Data.Entity.Migrations.Infrastructure.MigrationsLogger簡單Logging.Common實現
+0

我已經試過這個,但它不是我要找的。我希望能夠在我的初始化程序中執行以下操作:'Migrations.MigrationV103 migration = new Migrations.MigrationV103(); migration.Up();' –

+0

可能不是什麼OP後,但日誌遷移行代碼是真棒!感謝您的代碼片段。我現在可以記錄程序遷移。 – BenSwayne