使用EF Core 2.0 Migrations更新表添加新列时遇执行错误求助
解决EF Core添加新列时迁移失败的问题
嘿,作为EF Core新手遇到这种迁移问题真的很闹心,我来帮你分析下大概率的原因和对应的解决办法:
可能的原因1:新迁移文件生成错误
EF Core有时候会“抽风”,生成的新迁移里居然包含了重复创建表的代码,而不是只添加新列。你先去打开那个出问题的迁移文件20180417175820_AddOsTypeColumn.cs,看一下Up方法的内容。
如果里面写的是CreateTable而不是AddColumn,那问题就找到了!你需要手动修改这个方法,改成只添加新列的代码,比如:
protected override void Up(MigrationBuilder migrationBuilder) { // 把CreateTable的代码删掉,换成下面的AddColumn migrationBuilder.AddColumn<string>( name: "OsType", table: "MachineTypes", type: "nvarchar(max)", // 根据你的实际字段类型调整 nullable: true); // 如果你设置了非空,这里改成false }
修改完保存后,再重新运行dotnet ef database update应该就能正常执行了。
可能的原因2:迁移历史表记录丢失
EF Core靠数据库里的__EFMigrationsHistory表来跟踪哪些迁移已经执行过。如果第一次的init迁移记录没被正确写入这个表,或者不小心被删除了,EF Core就会认为MachineTypes表还没创建,所以在新迁移里尝试重新建表。
解决步骤:
- 连接到你的数据库,找到
__EFMigrationsHistory表,查看里面有没有init迁移对应的记录(就是第一次迁移文件开头的那个ID,比如2018XXXXXXXXX_init)。 - 如果没有这条记录,手动插入一条:
INSERT INTO __EFMigrationsHistory (MigrationId, ProductVersion) VALUES ('你的init迁移ID', '你用的EF Core版本号');
比如你的init迁移ID是20180416123456_init,EF Core版本是2.1.0-rtm-30799,就把对应值填进去。
3. 插入完成后,再运行dotnet ef database update。
可能的原因3:模型与数据库状态严重不一致
如果之前你手动修改过数据库或者模型,导致EF Core的模型快照和实际数据库状态不匹配,这种情况下最简单的办法是重置迁移(记得先备份数据库数据!):
- 删除项目里所有的迁移文件
- 连接数据库,删除
__EFMigrationsHistory表,同时删除已经创建的MachineTypes表 - 重新生成初始迁移:
dotnet ef migrations add init - 更新数据库:
dotnet ef database update - 然后再给模型添加新列,生成新迁移:
dotnet ef migrations add AddOsTypeColumn - 最后执行更新:
dotnet ef database update
最后给你个小tip:每次生成迁移后,先打开迁移文件检查下内容是否符合你的预期,再执行update,能避免很多莫名其妙的问题~
内容的提问来源于stack exchange,提问作者nathanjw
相关产品推荐
相关产品推荐

