12

如何在没有 nuget 的情况下迁移数据库?在生产环境中无法将 Visual Studio 与 nuget 一起使用。目前,许多示例仅教我们将 Visual Studio 与 nuget 一起使用。如何使用生成的 DbMigration 类?

4

6 回答 6

12

最简单的方法是:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<MyDbContext,
                                       MyDbMigrationsConfiguration>());

这将在初始化 DbContext 时运行迁移。

您也可以手动强制执行:

var migrator = new DbMigrator(new MyMigrationsConfiguration());
migrator.Update();

(相信你也得TargetDatabase在配置上设置,不过你可以试试)

于 2012-06-30T23:44:44.590 回答
5

以下是选项:

  1. 使用我们的 NuGet 包中附带的 migrate.exe 命令行工具。
  2. 如其他人所述,使用 MigrateDatabaseToLatestVersion 初始化程序。
  3. 使用 DbMigrator 类提供的运行时 API。
于 2012-08-17T17:11:05.097 回答
4

您可以使用 Web.config 设置迁移到最新版本 - 请参阅Rowan Miller 的这篇博文:

如果您使用 Code First 迁移,则可以使用 MigrateDatabaseToLatestVersion 初始化程序将数据库配置为自动迁移。

<contexts>
  <context type="Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, 
MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>

只需在此处交换您的上下文类: System.Data.Entity.MigrateDatabaseToLatestVersion 内置于 EF。此设置更新了相同想法的旧 AppSettings 版本。

在我看来,这是最好的方法,因为使用哪个初始化器的问题实际上是一个配置问题,并且您希望能够对此进行 Web.config,并理想地应用配置转换以适用于您的不同环境。

于 2012-07-16T01:20:23.263 回答
2

您可以使用 EF Power Tools 执行此操作,您可以使用 migrate.exe 程序从命令提示符运行迁移(例如构建后)。如果您想在生产数据库上运行迁移,您还可以使用 Update-Database 命令从迁移类生成 SQL 脚本,这在您需要通过 DBA 时非常有用。

EF Power Tools 可在 Visual Studio Gallery 上找到,也可以在此处查看这个非常有用的视频,其中包括关于 Update-Database 命令的内容。

于 2012-06-30T14:31:28.103 回答
1

还有另一种解决方案:

 Using DB = New SHAContext()
        If DB.Database.Exists() Then
            Dim migrator As New DbMigrator(New SHAClassLibrary.Migrations.Configuration())
            For Each m In migrator.GetDatabaseMigrations()
                Try
                    migrator.Update(m)
                Catch ex As Exception

                End Try
            Next
        End If
        'DB.test()
    End Using
于 2016-11-10T08:24:57.603 回答
0

我正在寻找一种方法来控制哪些迁移在代码中显式运行,而无需启用 DbConfiguration 类或自动迁移。

所以我设法创建了以下扩展:

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();                
    dbCrm.RunMigration(migration);
}
于 2016-01-13T13:13:04.180 回答