EF代码优先DbMigration没有的NuGet(EF Code First DbMigratio

2019-06-25 21:50发布

如何迁移数据库没有的NuGet? 这是不可能使用Visual Studio在生产环境中的NuGet。 目前,许多例子只是教我们使用Visual Studio中的NuGet。 如何使用生成的DbMigration类?

Answer 1:

最简单的方法是:

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

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

您也可以手动强制执行:

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

(我相信你也必须设置TargetDatabase上的配置,但你可以试试)



Answer 2:

下面是选项:

  1. 使用migrate.exe命令行工具,船舶在我们的NuGet包。
  2. 正如其他人所描述使用MigrateDatabaseToLatestVersion初始化。
  3. 使用可从DbMigrator类的运行时API。


Answer 3:

您可以使用一个Web.config设置迁移到最新版本-见由罗恩·米勒这篇博客文章 :

如果您使用的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这一点,最好申请配置转变为您不同的环境下工作。



Answer 4:

您可以使用EF电动工具做到这一点,还有的migrate.exe程序,您可以使用运行在命令提示符下迁移(交建为例)。 如果你想运行在生产数据库迁移,您还可以使用Update-Database命令从迁移类生成的SQL脚本,是非常有用的,如果你需要通过一个DBA。

EF电动工具都可以在Visual Studio库和可选这里 ,看看这个非常有用的视频 ,除其他事项外,有关Update-Database命令会谈。



Answer 5:

还有另一种解决方案:

 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


Answer 6:

我一直在寻找一种方式来控制哪些迁移代码中显式运行,而无需启用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);
}


文章来源: EF Code First DbMigration without nuget