2016-07-05 269 views
5

我在实体框架6.0。这是一个发展问题,而不是生产。EF代码优先数据库初始化和迁移混乱

我认为我有一个相互冲突的策略。 目前我有一个DropCreateDatabaseIfModelChanges 数据库初始化程序设置并使用种子方法在Configuration.cs启用迁移。 在添加迁移和运行更新数据库时,似乎像是何时删除并重新创建数据库以及何时运行种子方法一样幸运。 事实上,这是一个总的抽奖,当两者都发生时,我必须拉各种技巧才能使事情发挥作用。 有人可以告诉我是否有数据库初始化程序和迁移启用冲突。 谢谢

回答

3

这不是一个适当的组合。有一个MigrateDatabaseToLatestVersion初始化器用于迁移。

在早期开发过程中,您可能需要使用DropCreateDatabaseIfModelChanges初始值设定项(或CreateDatabaseIfNotExists)。初始化器有一个特殊的Seed()方法,只有在创建数据库时才会运行。

一旦你达到了数据库中的内容是一种痛苦的重点,你可以切换到迁移。更改您的初始化程序并启用迁移。请务必添加initial baseline migrationadd-migration Initial -IgnoreChanges),以便您仅在该点后才能获得更改。现在,您可以添加每次更新时都会运行的迁移Seeding,而不是仅在创建数据库时才运行的初始化程序Seed。

如果您需要重新创建数据库,您可以生成一个idempotent script,它将创建数据库并应用所有迁移。

+0

谢谢史蒂夫,最后一个comon意义上解释这个东西是如何工作的。我已经启用了迁移功能,并且有20多次迁移试图让这个东西起作用。因此,我将初始化程序更改为MigrateDatabaseToLatestVersion,并使用迁移种子来添加或更新种子数据。 – ShaunK

+0

另外,我已经创建了初始迁移。我需要再次使用-IgnoreChanges来做到这一点,如果有的话,为什么。谢谢 – ShaunK

+0

取决于您是否有其他数据库,如TEST,PROD或其他处于不同状态的Dev机器。如果是这种情况,您需要将它们全部放在同一页面上。如果这只是单个数据库并且所有更改都已应用,则可以删除所有迁移,删除__MigrationHistory中的所有记录并执行新的初始迁移-IgnoreChanges。现在,您的所有更改都将跟踪向前发展。 –

相关问题