代码之家  ›  专栏  ›  技术社区  ›  SpruceMoose

将所有迁移应用到特定迁移[duplicate]

  •  2
  • SpruceMoose  · 技术社区  · 7 年前

    在EF6中,我可以检索迁移并一步一步地运行它。

    EF 6代码

    public static void RunMigration(this DbContext context, DbMigration migration, string providerName, string manifest)
    {
        var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance);
        if (prop != null)
        {
            IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>;
            MigrationSqlGenerator generator = (new DbMigrationsConfiguration()).GetSqlGenerator(providerName);
            var statements = generator.Generate(operations, manifest);
            foreach (MigrationStatement item in statements)
                context.Database.ExecuteSqlCommand(item.Sql);
        }
    }
    
    0 回复  |  直到 8 年前
        1
  •  9
  •   bairog    6 年前

    你可以使用 GetPendingMigrations 扩展方法 DatabaseFacade 类(返回者 Database 的属性 DbContext )以获取挂起的迁移名称的列表。

    然后你可以得到 IMigrator 服务和使用 Migrate 传递每个目标迁移名称的方法:

    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Infrastructure;
    using Microsoft.EntityFrameworkCore.Migrations;
    
    DbContext db = ...;
    var pendingMigrations = db.Database.GetPendingMigrations().ToList();
    if (pendingMigrations.Any())
    {
        var migrator = db.Database.GetService<IMigrator>();
        foreach (var targetMigration in pendingMigrations)
            migrator.Migrate(targetMigration);
    }