我有一个MVC4应用程序,我最近升级到Entity Framework 5,我试图将我们的数据库迁移到使用迁移从开发风格的删除和创建每个运行。
这里是我在我的应用程序启动功能。
protected void Application_Start() { Database.SetInitializer( new MigrateDatabaseToLatestVersion< MyContext,Configuration >() ); ... }
我在我的存储库项目上运行Enable-Migrations命令,我认为这将创建一个初始迁移文件,但是它创建的唯一文件是配置
当我删除数据库,它创建它的预期通过代码首先和种子数据库从配置文件。在配置文件中我将所有Add()函数改为AddOrUpdate()
但是,它会在我的配置文件中运行种子函数,每次网站启动和重复所有的种子数据一次又一次。
我想象它会创建一个初始迁移文件作为我读的博客建议,我会把种子数据在那里,但它没有
任何人都可以解释我应该如何设置DB在代码,使它只有种子一次?
LINK: The migrations blog post I followed
虽然这是非常有趣的使用EF migrate.exe我已经切换到使用roundhouse运行迁移。我仍然使用EF来支持我的迁移基于模型,但我写了一个小的控制台应用程序写入迁移到sql文件。然后我使用roundhouse通过我的rake构建脚本自己执行迁移。有一个更多的过程涉及,但它比使用EF更稳定,以在应用程序启动时执行迁移。
解决方法
这已被证明是一个流行的帖子,所以我已经根据他人的反馈更新。要知道的主要事情是,配置类中的种子方法是每次应用程序启动时运行,这不是模板方法中的注释。看到有人在微软对这个
post的答案,为什么是 – 感谢Jason Learmouth找到了。
如果你像我一样只想运行数据库更新,如果有任何未决的迁移,那么你需要做一些更多的工作。你可以通过调用migrator.GetPendingMigrations()来查找是否有挂起的迁移,但是你必须在ctor中这样做,因为在调用Seed方法之前清除挂起的迁移列表。在Migrations.Configuration类中实现的代码如下:
internal sealed class Configuration : DbMigrationsConfiguration<YourDbContext> { private readonly bool _pendingMigrations; public Configuration() { // If you want automatic migrations the uncomment the line below. //AutomaticMigrationsEnabled = true; var migrator = new DbMigrator(this); _pendingMigrations = migrator.GetPendingMigrations().Any(); } protected override void Seed(MyDbContext context) { //Microsoft comment says "This method will be called after migrating to the latest version." //However my testing shows that it is called every time the software starts //Exit if there aren't any pending migrations if (!_pendingMigrations) return; //else run your code to seed the database,e.g. context.Foos.AddOrUpdate( new Foo { bar = true}); } }
我应该指出,有些人建议将种子代码放在实际的“向上”迁移代码中。这工作,但意味着你需要记住把种子代码在每个新的迁移,它很漂亮的记住,所以我不会这样做。然而,如果你的种子随着每次迁移而改变,那么这可能是一个很好的方法。