如何在没有nuget的情况下迁移数据库?在生产环境中无法将Visual Studio与nuget一起使用。目前,许多示例仅教我们将Visual Studio与nuget一起使用。 如何使用生成的DbMigration类?
答案 0 :(得分:12)
最简单的方法是:
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<MyDbContext,
MyDbMigrationsConfiguration>());
这将在初始化DbContext时运行迁移。
您也可以手动强制执行:
var migrator = new DbMigrator(new MyMigrationsConfiguration());
migrator.Update();
(我相信您还必须在配置上设置TargetDatabase
,但您可以尝试)
答案 1 :(得分:5)
以下是选项:
答案 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);
}