手动更改迁移文件并保持兼容的__migrationhistory记录

时间:2012-11-13 18:31:29

标签: entity-framework ef-migrations

在使用Entity Framework Code First Migrations时,我和我的团队在尝试使我们的开发(以及很快,客户的生产)数据库与我们的模型保持同步时遇到了很多问题。

由于DropForeignKey()方法调用错误,我不得不手动编辑迁移代码,似乎问题开始发生了。 (我的项目是使用MySQL 5.5,MySQL Connector 6.6.2,EF 4.3。)有问题的命令:

DropForeignKey("Recebimento", "ComponenteFabricante_Id", "CompFab");

更改为:

DropForeignKey("Recebimento", "FK_RecebimentoMaterial_CompFab_ComponenteFabricante_Id");

从那时起,每当我尝试Update-Databse时,即使我知道我已经拥有反映当前模型映射的所有迁移代码,也会显示以下消息:“Unable更新数据库以匹配当前模型,因为存在挂起的更改并禁用自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。 您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移。“

我不想将更改AutomaticMigrationEnabled用于true,因此我运行Add-Migration Test以查看已创建的内容。创建的文件包含已经应用(通过以前的迁移)到数据库的命令。如果我尝试运行上一次迁移,Update-Database失败(类似于“列已存在”或“表已存在”,这是正确的错误消息,因为迁移有重复的代码)。

我怀疑这个问题与表__migrationhistory保存在Model列上的值(迁移所应用的模型的二进制表示)有关 - 也许该值不是正确的值,因为手册纠正了。

如何才能手动编辑迁移代码并使其正常运行?使用Entity Framework Code First迁移时的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

您是否尝试使用ForeignKey属性在模型中手动指定外键名称?

[ForeignKey("FK_RecebimentoMaterial_CompFab_ComponenteFabricante_Id")]
YourNavigationProperty

答案 1 :(得分:1)

我遇到了类似的问题,我的__migrationhistory表与模型不同步。我使用代码优先重新创建了一个现有的数据库,但当时我的团队没有时间学习迁移并使它们正常工作。我们通过跟踪SQL语句来管理模型更改。因此,当我最终尝试开始使用迁移时,已经在所有地方应用了更改,但EF希望创建迁移。

为了解决这个问题,我可以删除__migrationhistory表,并创建一个新的初始迁移,但不对模型进行任何更改。这可能是不必要的,因为您可以添加迁移并将参数传递给-IgnoreChanges。这应该更新__migrationhistory而不需要运行任何数据库SQL更改。

无论如何,我想在这里发帖,因为我的问题很相似,我最终看到这个线程希望找到解决方案。我希望其他人能从LADISLAV MRNKA的这篇文章中找到一些用处,因为我希望我早些时候见过它。

http://www.ladislavmrnka.com/2012/03/ef-4-3-migrations-and-existing-database/