6

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

由于 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即使我知道我已经拥有反映当前模型映射的所有迁移代码,也会显示以下消息:“无法更新数据库以匹配当前模型,因为有待处理的更改和自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。您可以使用 Add-Migration 命令将挂起的模型更改写入代码-基于迁移。”

我不想使用 change AutomaticMigrationEnabledto true,所以我跑来Add-Migration Test看看创建了什么。创建的文件包含已经(通过以前的迁移)应用到数据库的命令。如果我尝试运行最后一次迁移,Update-Database则会失败(类似于“列已存在”或“表已存在”,这是正确的错误消息,因为迁移具有重复的代码)。

我怀疑这个问题与表__migrationhistory保存在 Model 列上的值(迁移应用的模型的二进制表示)有关 - 由于进行了手动更正,因此该值可能不是正确的值。

我该怎么做才能手动编辑迁移代码并使其正常工作?使用 Entity Framework Code First 迁移时的最佳实践是什么?

4

2 回答 2

1

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

[ForeignKey("FK_RecebimentoMaterial_CompFab_ComponenteFabricante_Id")]
YourNavigationProperty
于 2013-10-05T13:54:26.780 回答
1

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

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

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

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

于 2013-10-17T17:45:57.760 回答