我希望能够手动执行迁移的 Up() 方法。目前我正在尝试这样做,但调用包含 CreateTable 方法并不会创建表。我怀疑连接设置不正确。并且没有属性可以设置它。
我也尝试过 DbMigrator,但它调用了一些内部 EF 迁移方法。
那么有谁知道如何设置 DbMigration.Up 方法使用的连接?
提前致谢!
我希望能够手动执行迁移的 Up() 方法。目前我正在尝试这样做,但调用包含 CreateTable 方法并不会创建表。我怀疑连接设置不正确。并且没有属性可以设置它。
我也尝试过 DbMigrator,但它调用了一些内部 EF 迁移方法。
那么有谁知道如何设置 DbMigration.Up 方法使用的连接?
提前致谢!
我使用以下代码在 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 中的默认(命名)连接字符串来应用挂起的更改。
要完全手动控制迁移,您可以使用以下扩展方法:
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);
}