没有nuget的EF Code First DbMigration

时间:2012-06-30 04:39:04

标签: entity-framework ef-code-first ef-migrations

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

6 个答案:

答案 0 :(得分:12)

最简单的方法是:

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

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

您也可以手动强制执行:

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

(我相信您还必须在配置上设置TargetDatabase,但您可以尝试)

答案 1 :(得分:5)

以下是选项:

  1. 使用NuGet中附带的migrate.exe命令行工具 包。
  2. 使用MigrateDatabaseToLatestVersion初始化程序作为 其他人描述过。
  3. 使用可用的运行时API DbMigrator类。

答案 2 :(得分:4)

您可以使用Web.config设置迁移到最新版本 - 请参阅this blog post by Rowan Miller

如果您使用的是Code First Migrations,则可以使用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,并且理想情况下应用配置转换以适用于您的不同环境。

答案 3 :(得分:2)

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

EF Power Tools可在Visual Studio库中选择,也可以选择here,查看这个非常有用的video,其中包括有关Update-Database命令的内容。

答案 4 :(得分: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

答案 5 :(得分: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);
}