C# 在EF中手动调用DbMigration.Up

C# 在EF中手动调用DbMigration.Up,c#,entity-framework,C#,Entity Framework,我希望能够手动创建迁移的Up()方法。目前我正在尝试这样做,但是调用包含CreateTable方法的函数不会创建表。我怀疑连接未正确设置。并且没有可设置的属性 我还尝试了DbMigrator,但它调用了一些内部EF迁移方法 那么,有人知道如何设置DbMigration.Up方法使用的连接吗 提前谢谢 我使用以下代码在应用程序启动事件中显式升级我的数据库: var config = new MyDatabaseMigrationsConfiguration(); var migrator = ne

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

我还尝试了DbMigrator,但它调用了一些内部EF迁移方法

那么,有人知道如何设置DbMigration.Up方法使用的连接吗


提前谢谢

我使用以下代码在应用程序启动事件中显式升级我的数据库:

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来应用挂起的更改

  • 如果希望显式,可以在migrator.Update()中指定TargetMigration
  • MyCommonMigrationLogger只是一个简单的日志记录。System.Data.Entity.Migrations.Infrastructure.MigrationLogger的常见实现

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

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);
    }
}
您可以在DbContext上运行它:

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

EntityFramework是开源的,因此您可以查看源代码,以准确地了解他们在做什么来实现迁移。谢谢你的提示。不幸的是,我找不到解决办法。看来我在做我不该做的事。设法用另一种方法解决这个问题。我已经试过了,但这不是我想要的。我希望能够在初始值设定项中执行以下操作:
Migrations.MigrationV103 migration=new Migrations.MigrationV103();migration.Up()
可能不是OP想要的,但是logging migrator的代码行太棒了!谢谢你的代码片段。我现在可以记录程序迁移。
using (var dbCrm = new CrmDbContext(connectionString))
{
    var migration = new CreateIndexOnContactCodeMigration();
    migration.Up(); // or migration.Down();                
    dbCrm.RunMigration(migration);
}