首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >代码启动应用时触发EF迁移

代码启动应用时触发EF迁移
EN

Stack Overflow用户
提问于 2011-12-15 00:47:27
回答 2查看 7.5K关注 0票数 6

使用实体框架迁移(Beta1),在开发期间使用更新数据库命令是很好的。

但是,当应用程序在某个客户的服务器上运行时,我真的希望我的应用程序在启动时自动将其数据库模式更新为最新版本。

这个是可能的吗?文档稀缺。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-15 15:39:32

在RTM之前,他们没有提供这样做的方法,在这一点上,他们承诺提供一个命令行应用程序和一个msdeploy提供程序。来源:http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx

当然,powershell命令并不满足于此,它存储在packages目录中并且是纯文本,它似乎只是加载了存储在同一目录中的一个名为EntityFramework.Migrations.Commands的程序集。

通过对该程序集进行跟踪,我得出了以下结论

代码语言:javascript
运行
复制
public class MyContext : DbContext
{
  static MyContext()
  {
    DbMigrationsConfiguration configuration = new DbMigrationsConfiguration() {
      MigrationsAssembly = typeof(MyContext).Assembly,
      ContextType = typeof(MyContext),
      AutomaticMigrationsEnabled = true,                
    };

    DbMigrator dbMigrator = new DbMigrator(configuration);          
    dbMigrator.Update(null);            
  }
}

更新:经过一些实验,我想出了更多的东西

  • 在上下文的静态构造函数中执行更新是不好的,因为它会破坏powershell命令,最好以另一种方式(Global.asax、WebActivator或Main方法)将代码添加到应用程序启动中。
  • 以上代码只有在使用AutomaticMigrations时才有效,您需要设置MigrationsNamespace使其在手动创建的迁移时拾取
  • 我创建的配置类应该已经存在于您的项目中(在安装迁移nuget包时添加),因此只需实例化它即可。

这意味着代码被简化为

代码语言:javascript
运行
复制
DbMigrator dbMigrator = new DbMigrator(new NAMESPACE.TO.MIGRATIONS.Configuration());
dbMigrator.Update(null);        
票数 14
EN

Stack Overflow用户

发布于 2015-04-11 18:47:50

此问题的另一个选项是添加

代码语言:javascript
运行
复制
Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, NAMESPACE.TO.MIGRATIONS.Configuration>());

行添加到您的Global.asax Application_Start方法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8508280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档