在EF中手动调用DbMigration.Up

Dmy*_* I. 6 c# entity-framework

我希望能够手动进行迁移的Up()方法.目前我正在尝试这样做,但调用包含CreateTable方法的方法不会创建表.我怀疑连接设置不正确.并且没有设置它的属性.

我也试过DbMigrator,但它调用了一些内部EF迁移方法.

那么有谁知道如何设置DbMigration.Up方法使用的连接?

提前致谢!

Mar*_*ten 6

我使用以下代码明确地能够在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();
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这将使用我的DatabaseContext中的默认(命名)连接字符串来应用挂起的更改.

  • 如果要显式,可以在migrator.Update()中指定TargetMigration
  • MyCommonMigrationsLogger只是System.Data.Entity.Migrations.Infrastructure.MigrationsLogger的一个简单的Logging.Common实现.


小智 5

要完全手动控制迁移,您可以使用以下扩展方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

示例:有这样的迁移:

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

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

您可以针对您的 DbContext 运行它:

using (var dbCrm = new CrmDbContext(connectionString))
{
    var migration = new CreateIndexOnContactCodeMigration();
    migration.Up(); // or migration.Down();                
    dbCrm.RunMigration(migration);
}
Run Code Online (Sandbox Code Playgroud)