2013-04-25 48 views
0

我的模式已经发展了多次迭代。我有一套迁移过程,将架构从一个空的数据库转移到数十个表格和数十列的数据库中。EF迁移 - 直最终架构

一路上不断有表,列和约束的一些补充,有时还会(在经验和新的知识或规范的改变光)通过去除或改变。有时候表或列名已被重新使用或重新使用。

现在,EF迁移似乎完全能够通过创建,更改,删除的顺序运行,再次创建,变更等,以获得最新的架构,但感觉不对。在极端情况下,可能会有数十个迁移创建表,然后是数十个删除表,直到最终的模式可能是一个或两个表(不太可能,我知道)。从头开始到最终表格的选项都是正确的。

在我的Ruby天ActiveRecord的迁移有只建了最终方案,而无需通过步进,并可能撤销或沿途重做工作的选项。当然,这意味着在每次迁移后保持模式的完整DDL版本是最新的,但不知何故,它会更加优雅。

任何人做实体框架类似的事情?

+0

取决于目标模式的状态。你的意思是一个新的空模式。或者现有的产品架构? – 2013-04-25 12:34:24

+0

我在考虑启动一个新数据库的情况 - 也许只是作为一个测试或演示,或者当您满意系统准备就绪并且您想要在客户的实时服务器上创建数据库时,或者可能直接跳转到2.0版本以供新客户使用。 – 2013-04-25 12:49:40

回答

0

您可能想尝试删除数据库中的__MigrationHistory表,删除Migrations文件夹(备份Configuration.cs文件),然后再次启用迁移。

+0

不确定你是否明白我的意思......我可以肯定整个迁移线索的核心思想,并重新开始让EF向我展示基于当前模型集建立新模式所需的代码 - 至少直到我已部署到第一个活动实例。在ruby世界中,ActiveRecord有效地维护了一个特殊的单一迁移Up()方法,它将清空数据库并重新创建所有内容。这个rake任务被称为“rake db:schema:load”作为“rake db:migrate”的替代方法。迁移是保留的,所以你可以(如果你想)加载模式,然后向下迁移5个步骤。 – 2013-04-25 12:09:55

+0

是的,在这种情况下,您将会重新开始并创建1个初始迁移,从而使您获得当前模式,因此无法回滚迁移。如果您对1次迁移不满意,那么您可以手动整理现有的迁移类文件。 – devdigital 2013-04-25 12:48:33

0

然后从这里开始的PM命令来构建脚本

Generate full SQL script from EF 5 Code First Migrations

从代码中,没有对ObjectContext的一个选项不是直接的DbContext

string script = (context as IObjectContextAdapter).ObjectContext.CreateDatabaseScript(); 

当然,如果自动迁移将工作你不需要看到魔法并改变了生成的脚本。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourDbContext, 
          YourMigrationConfiguration>() 
    Context.Database.Initialize(true); 

而且如果是EmptyDb Schema,EF将免费提供。

Context.Database.Initialize(true);