我正在使用 Entity Framework 5.0 Code First 迁移,并且在运行 Update-Database 时遇到问题。它说有待定的模型更改;但它应该是最新的,所以我运行
Add-Migration SomeMigrationName
并且它创建了一个文件......但是,它创建了一个与先前迁移基本上相同的文件(如果我尝试在该文件上再次更新数据库,它会失败并出现与尝试删除非存在的约束)。此外,我已经能够确认“原始”迁移已基于数据库中的数据模型以及 __MigrationHistory 表中存在的记录运行!
如果我删除整个数据库,然后自动或手动再次运行所有迁移,我会遇到同样的问题。
我拥有的“原始”迁移文件如下:
public partial class RenameLinkColumns : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User");
DropIndex("dbo.Listing", new[] { "OfferedByUserId" });
AddColumn("dbo.Listing", "ListedByUserId", c => c.Int(nullable: false));
AddForeignKey("dbo.Listing", "ListedByUserId", "dbo.User", "UserId", cascadeDelete: true);
CreateIndex("dbo.Listing", "ListedByUserId");
DropColumn("dbo.Listing", "OfferedByUserId");
}
public override void Down()
{
AddColumn("dbo.Listing", "OfferedByUserId", c => c.Int(nullable: false));
DropIndex("dbo.Listing", new[] { "ListedByUserId" });
DropForeignKey("dbo.Listing", "ListedByUserId", "dbo.User");
DropColumn("dbo.Listing", "ListedByUserId");
CreateIndex("dbo.Listing", "OfferedByUserId");
AddForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User", "UserId", cascadeDelete: true);
}
}
当我再次运行 Add-Migration 时,该文件中的 Up/Down 方法与这些方法完全相同。
迁移能够正确检测到我重命名了 ForeignKey 列,这让我印象深刻。但这就是导致窒息的原因吗?
似乎有一种解决方法:我已经删除了数据库和所有迁移文件,并创建了一个新的“初始”迁移,但如果可能的话,我不希望这样做。
更新:这不是导致此问题的最新迁移,但问题是在合并后开始的(我正在单独工作,但正在模拟分支上的团队工作以了解有关 git 的更多信息),并尝试使数据库与合并。这可能是由于在合并后以某种特定的顺序放置迁移造成的 - 尽管已注意到,当我给它们一个空数据库时,迁移确实按照它们运行的顺序工作。
此外,当表中有数据时,这种原始迁移需要手动调整,因为需要将数据从旧列复制到新列。但是,我在对该文件进行手动编辑和不进行手动编辑的情况下测试了该文件,但仍然遇到了上述行为。