2013-08-26 9 views
5

Chcę móc ręcznie ręcznie przeprowadzić metodę migracji Up(). Obecnie próbuję to zrobić, ale wywołanie zawierające metodę CreateTable nie tworzy tabeli. Podejrzewam, że połączenie nie zostało poprawnie ustawione. I nie ma właściwości, aby to ustawić.Ręczne wywołanie DbMigration.Up w EF

Próbowałem również DbMigrator, ale wywołuje niektóre wewnętrzne metody migracji EF.

Czy ktoś wie, jak ustawić połączenie, które ma być używane przez metodę DbMigration.Up?

Z góry dziękuję!

+1

Entity Framework jest open source, więc można spojrzeć na kod źródłowy, aby dowiedzieć się dokładnie, co robią aby dokonać migracji. http://entityframework.codeplex.com/SourceControl/latest –

+0

Dzięki za napiwek. Niestety nie mogłem znaleźć rozwiązania. Wygląda na to, że próbuję zrobić to, czego nie powinienem. Zarządzaj, aby rozwiązać problem w inny sposób. –

Odpowiedz

4

uzyskać pełną ręczną kontrolę nad migracjami, można użyć następującą metodę rozszerzenia:

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); 
    } 
} 

Przykład: Mając migracja tak:

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

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

Można go uruchomić na swojej DbContext:

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

używam następujący kod jawnie móc zaktualizować bazę danych w przypadku 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(); 
} 

O ile wiem, to użyje domyślnego (nazwie) ConnectionString z mojego DatabaseContext do zastosuj zmiany.

  • Można określić TargetMigration w migrator.Update() Jeśli chcesz być jawne
  • MyCommonMigrationsLogger jest tylko prosta implementacja Logging.Common dla System.Data.Entity.Migrations.Infrastructure.MigrationsLogger
+0

Próbowałem już tego, ale nie tego szukam. Chcę w moim inicjalizatorze wykonać następujące czynności: 'Migrations.MigrationV103 migration = new Migrations.MigrationV103(); migration.Up(); ' –

+0

Może nie być tym, co OP był po, ale logowanie kodu linii migracyjnej jest niesamowite! Dziękuję za ten fragment kodu. Mogę teraz rejestrować migracje programowe. – BenSwayne