在生产中使用entity framework(代码优先)迁移
我只是考虑使用EF迁移为我们的项目,特别是在版本之间执行生产模式更改。
我已经看到提到有一个API在运行时使用DbMigration
类来执行这些迁移,但是我找不到任何具体的例子。
理想情况下,我希望每个数据库更改都需要一个DbMigration
文件,并且应用程序会自动从应用程序的当前版本升级到最新版本。
有一个数据库初始化程序可以用来实现在启动时迁移到最新版本(或者,更好的是,dbinitializer将启动第一个数据库访问), MigrateDatabaseToLatestVersion
,你可以这样使用它:
Database.SetInitializer<ObjectContext>( new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());
关于每个迁移一个文件,如果启用自动迁移,您可以在项目的根目录下的Migrations
文件夹中(默认情况下)find它们。
相关信息,例如: http : //weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx
这也起作用:
var configuration = new MyDbContextConfiguration(); configuration.TargetDatabase = new DbConnectionInfo( database.ConnectionString, database.ProviderName); var migrator = new DbMigrator(configuration); migrator.Update();
您也可以致电:
migrator.GetPendingMigrations();
以获得它需要应用的迁移的列表。
既然你没有指定你正在使用的Visual Studio版本,或者数据库,我会在这里添加一个答案,在VS2015中用微软的SQL Server来说,现在使用“发布”工具这非常容易。
你不需要打扰你说的API。 只需在本地完成工作,更改模型,应用迁移等,然后在想要推出发布/testing服务器时,使用发布工具。
您可以select在第一次启动应用程序时将本地进行的任何迁移应用到远程服务器。
一旦你完成了所有的迁移,一切都在本地完成(可以在你的开发环境中使用),然后发布(右键单击项目,点击“发布…”勾选“执行代码先迁移(在应用程序启动时运行)”checkbox“设置”选项卡,然后它将在第一次访问应用程序时应用迁移(所以第一次会有一个很短的延迟)。
指南: https : //msdn.microsoft.com/en-us/library/dd465337(v=vs.110).aspx
我学到了这一切,因为我必须对Windows 2012服务器执行此操作: http : //www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/
祝你好运!
我想控制哪些迁移明确地在代码中运行,并且在大量search之后,我设法开发了以下技术,而不需要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"); } }
我们会这样使用它:
using (var dbCrm = new CrmDbContext(connectionString)) { var migration = new CreateIndexOnContactCodeMigration(); migration.Up(); dbCrm.RunMigration(migration); }
问候。